如果我有下表,建立一個我已經在這里使用在線 SQLite 編輯器問過的一般 SQL 問題:
| 物品 | 星期 | 銷售量 |
|---|---|---|
| 專案1 | 1 | 35 |
| 專案2 | 1 | 25 |
| 第 3 項 | 1 | 24 |
| 專案1 | 2 | 35 |
| 專案2 | 2 | 34 |
| 專案1 | 3 | 24 |
| 專案2 | 3 | 45 |
| 專案1 | 4 | 44 |
| 專案2 | 4 | 51 |
| 專案1 | 5 | 1 |
| 第 3 項 | 5 | 100 |
我怎樣才能得到這樣的輸出:
| 物品 | 周 | 總銷售額 |
|---|---|---|
| 專案1 | 1-2 | 70 |
| 專案2 | 3-4 | 96 |
| 第 3 項 | 5 | 100 |
在上表中,第 1-2 周被分配給 item1,因為該時間段的總銷售額最高的是 item1。與第 3-4 周相同,分配給專案 2,因為該專案的總銷售額在該時間段內最高。
我一直在處理的一些代碼如下:
SELECT item,
SUM(sales) OVER (
PARTITION BY week order by item) AS total_sales
FROM TABLE1
GROUP BY item;
建議 CASE 獲取該商品在所有商品中銷量最高的一周的“范圍”,但這會填充具有相同周范圍的商品。添加案例后,代碼如下:
SELECT item,
CASE
WHEN week <= 2 THEN '1-2'
WHEN week <= 4 THEN '3-4'
WHEN week <= 5 THEN '5'
ELSE '>5'
END weeks,
SUM(sales) OVER(partition by week order by item) as total_sales
FROM table1
GROUP BY item;
這是一個演示
上面的代碼輸出類似于:
| 物品 | 周 | 總銷售額 |
|---|---|---|
| 專案1 | 1-2 | 70 |
| 專案2 | 1-2 | 96 |
| 第 3 項 | 1-2 | 100 |
這是錯誤的,因為在第 1-2 周內只有 item1 是最暢銷的。
我真的不知道當它是最暢銷的商品時,一個人將如何獲得一周的時間。同樣,item1 將僅填充一次“第 1-2 周”,item2 將僅填充一次“第 3-4 周”,因為那是它們銷量最高的周。
其他一切我都做得很好。非常感謝任何指導或幫助。
uj5u.com熱心網友回復:
我想如果你只是添加一個 row_number() 函式來實作你的業務邏輯,然后選擇 row_number() = 1 的行。
這是小提琴https://www.db-fiddle.com/f/oWBDK3xTSgiCMaw7MS5XKm/0
這是你的演示資料的小提琴 https://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=62450660190d7f161f5790d188736260
with t as (
SELECT item,
CASE
WHEN week <= 2 THEN '1-2'
WHEN week <= 4 THEN '3-4'
WHEN week <= 5 THEN '5'
ELSE '>5'
END weeks,
SUM(sales) as total_sales
FROM table1
GROUP BY item,
CASE
WHEN week <= 2 THEN '1-2'
WHEN week <= 4 THEN '3-4'
WHEN week <= 5 THEN '5'
ELSE '>5'
END ),
t2 as (
select item, weeks, total_sales,
row_number() over (partition by weeks order by total_sales desc) rn from t)
select * from t2 where rn = 1 order by weeks
uj5u.com熱心網友回復:
您需要 2 個級別的聚合:
SELECT item, weeks, MAX(total_sales) total_sales
FROM (
SELECT item,
CASE
WHEN week <= 2 THEN '1-2'
WHEN week <= 4 THEN '3-4'
WHEN week <= 5 THEN '5'
ELSE '>5'
END weeks,
SUM(sales) total_sales
FROM table1
GROUP BY item, weeks
)
GROUP BY weeks;
外部查詢在聚合查詢中使用 SQLite 的裸列特性,并回傳最大值為 的行total_sales。
請參閱演示。
uj5u.com熱心網友回復:
我認為問題所有者正在尋找本周銷量最高的商品,那么該周必須添加到商品的周數列中。
獲取每周的最高銷售額,結合每周資訊和每個專案的總銷售額
select item ,STUFF (
(SELECT '-' week
FROM (select * from
(select *, ROW_NUMBER() OVER (PARTITION BY week ORDER BY sales DESC) as rn from table1)A where rn=1) x where x.item=y.item order by week
FOR XML PATH('')), 1, 1, ''
), sum(sales) FROM (select * from
(select *, ROW_NUMBER() OVER (PARTITION BY week ORDER BY sales DESC) as rn from table1)A where rn=1) y group by item
如果您有其他周資料,例如第 6 周,并且銷量最高的商品是 item1,那么 item1 將具有“第 1-2-6 周”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/467188.html
上一篇:從表中洗掉SQLite鏈
