Db2
DB2 多行具有相同的值
這是我第一次在 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 ;