Db2

DB2 多行具有相同的值

  • February 18, 2019

這是我第一次在 stackexchange 上發帖,我希望我對這個問題做了盡職調查。我正在解決一個我似乎無法解決的問題。考慮一下電子商店連鎖店的這種情況,其中日常交易記錄在數據庫中:

表結構

----------------------------------------------
| daily_sales_records                        |
----------------------------------------------
| store_id |    date    |product_code| sales |
|     1    | 2019-01-01 |    001     |  0.0  |
|     1    | 2019-01-01 |    002     |  0.0  |
|     1    | 2019-01-01 |    003     |  0.0  |
|     1    | 2019-01-01 |    004     |  0.0  |
|          |            |            |       |
|     2    | 2019-01-01 |    001     |  0.0  |
|     2    | 2019-01-01 |    002     | 25.5  |
|     2    | 2019-01-01 |    003     | 12.0  |
|     2    | 2019-01-01 |    004     |  0.0  |
|          |            |            |       |
|     3    | 2019-01-01 |    001     |  0.0  |
|     3    | 2019-01-01 |    002     |  0.0  |
|     3    | 2019-01-01 |    003     |  0.0  |
|     3    | 2019-01-01 |    004     |  1.0  |
|          |            |            |       |
|     1    | 2019-01-02 |    001     |  0.0  |
|     1    | 2019-01-02 |    002     |  0.0  |
|     1    | 2019-01-02 |    003     |  1.0  |
|     1    | 2019-01-02 |    004     |  3.0  |
|                   ......                   |
|     1    | 2019-01-03 |    001     |  0.0  |
|     1    | 2019-01-03 |    002     |  0.0  |
|     1    | 2019-01-03 |    003     |  0.0  |
|     1    | 2019-01-03 |    004     |  7.0  |
----------------------------------------------

(未顯示:主鍵,這將是每個條目的時間戳)

鑑於這種情況,我希望檢索當天沒有銷售產品程式碼 001、002、003 的所有商店記錄,以及這些記錄發生的日期。

鑑於上表,理想的輸出將類似於:

----------------------------------------------
| store_id |    date    |product_code| sales |
|     1    | 2019-01-01 |    001     |  0.0  |
|     1    | 2019-01-01 |    002     |  0.0  |
|     1    | 2019-01-01 |    003     |  0.0  |
|          |            |            |       |
|     3    | 2019-01-01 |    001     |  0.0  |
|     3    | 2019-01-01 |    002     |  0.0  |
|     3    | 2019-01-01 |    003     |  0.0  |
|          |            |            |       |
|     1    | 2019-01-03 |    001     |  0.0  |
|     1    | 2019-01-03 |    002     |  0.0  |
|     1    | 2019-01-03 |    003     |  0.0  |
----------------------------------------------

(商店 ID 2 在 2019 年 1 月 1 日被排除在外,因為產品 002 和 003 有銷售,而商店 1 在 2019 年 1 月 2 日被排除在外,因為產品 003 有銷售)

或者 - 抱歉,我對 DB2 非常生疏,但我確實記得生成緊湊結果表的可能性。如果是這樣,它可能看起來像這樣:

-------------------------
| no_sale_days          |
-------------------------
| store_id |    date    |
|     1    | 2019-01-01 |
|     1    | 2019-01-03 |
|     3    | 2019-01-01 |
-------------------------

我嘗試的最後一個實驗一次只搜尋一個商店(這只是我的想法,我現在沒有我的筆記,所以如果程式碼中有任何錯誤,請原諒) :

SELECT date, 
      sum(sales) as salesum
FROM   DAILY_SALES_RECORDS
WHERE  STORE_ID = '1'
 AND  PRODUCT_CODE IN ('001', '002', '003')
 AND  SALES = 0
GROUP  BY DATE
HAVING SUM(SALES) = 0

是否可以擴展此程式碼以覆蓋daily_sales_records 數據庫中的所有store_id?還是我只是在這個問題上想得太認真了?

CTE 部分返回未售出此產品的商店和日期“001,002,003”,第二部分僅返回未售出任何產品的商店和日期。

注意:COUNT(*) = 3因為您正在尋找 3 種產品。

WITH ct AS
(
 SELECT
   store_id,
   dt,
   product_code
 FROM
   DAILY_SALES_RECORDS
 WHERE
   product_code IN ('001', '002', '003')
 GROUP BY
   store_id,
   dt,
   product_code
 HAVING
   SUM(sales) = 0
)
SELECT 
 store_id,
 dt
FROM
 ct
GROUP BY
 store_id,
 dt
HAVING
 COUNT(*) = 3;
store_id | dt 
-------: | :------------------
 1 | 01/01/2019 00:00:00
 3 | 01/01/2019 00:00:00
 1 | 03/01/2019 00:00:00

db<>在這裡擺弄

正如ypercube在評論中指出的那樣,最簡單的方法是按 store_id 和 date 分組,返回那些沒有售出的產品:

SELECT
   store_id,
   dt 
 FROM
   DAILY_SALES_RECORDS
 WHERE
   product_code IN ('001', '002', '003')
 GROUP BY
   store_id,
   dt
 HAVING
   SUM(sales) = 0 ;

引用自:https://dba.stackexchange.com/questions/229973