這個問題在這里已經有了答案: 如何在 MySQL 中同時使用視窗函式和非視窗函式來解決以下問題?[復制] SQL 如何根據條件從另一列中減去一列 3 個答案 昨天關門。
下表是不同品牌奶茶店的利潤。如何使用 MySQL 計算 (milkA milkB) 和 milkC 基于每個日期的不同利潤。(在這種情況下如何使用非視窗函式和視窗函式來處理)
示例 milk_tea 表:
| 時間日期 | 品牌 | 利潤 |
|---|---|---|
| 2020-01-01 | 牛奶A | 400 |
| 2020-01-01 | 牛奶B | 200 |
| 2020-01-01 | 牛奶C | 300 |
| 2020-01-02 | 牛奶A | 200 |
| 2020-01-02 | 牛奶B | 300 |
| 2020-01-02 | 牛奶C | 100 |
| …… |
例如:對于timeDate 2020-01-01,差值等于(400 200) - 300 = 300;
400是milkA(brand_name)的利潤,200是milkB(brand_name)的利潤,300是milkC(brand_name)的利潤。
筆記:
- 假設所有列都具有正確的型別,例如 Date 型別中的 timeDate。
- 可能還有其他名牌奶茶店,例如milkD、milkE。
- 假設所有列中沒有空值
在 MySQL 中定義表的示例代碼:
create table milk_tea(
timeDate DATE,
brand_name VARCHAR(100) NOT NULL,
profit INT
);
INSERT INTO milk_tea VALUES ('2020-01-01', 'milkA', 400);
INSERT INTO milk_tea VALUES ('2020-01-01', 'milkB', 200);
INSERT INTO milk_tea VALUES ('2020-01-01', 'milkC', 300);
INSERT INTO milk_tea VALUES ('2020-01-02', 'milkA', 200);
INSERT INTO milk_tea VALUES ('2020-01-02', 'milkB', 300);
INSERT INTO milk_tea VALUES ('2020-01-02', 'milkC', 100);
期望的輸出:
| 時間日期 | 差異利潤 |
|---|---|
| 2020-01-01 | 300 |
| 2020-01-02 | 400 |
| …… |
有人可以給我一些 MySQL 代碼嗎?非常感謝
uj5u.com熱心網友回復:
您需要條件聚合(聚合函式內的布爾運算式):
select
timedate,
sum(case when brand_name in ('milkA', 'milkB') then profit end) as profit_ab,
sum(case when brand_name = 'milkC' then profit end) as profit_c,
sum(case when brand_name = 'milkC' then -profit else profit end) as diff
from milk_tea
where brand_name in ('milkA', 'milkB', 'milkC')
group by timedate
order by timedate;
uj5u.com熱心網友回復:
您可以在這里使用條件聚合:
SELECT
timeDate,
MAX(CASE WHEN brand_name = 'milkA' THEN profit ELSE 0 END)
MAX(CASE WHEN brand_name = 'milkB' THEN profit ELSE 0 END) -
MAX(CASE WHEN brand_name = 'milkC' THEN profit ELSE 0 END) AS diff_profit
FROM milk_tea
GROUP BY timeDate
ORDER BY timeDate;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438780.html
