我目前已經創建了以下模仿我當前表的極其簡化的 mysql 表。
促銷表:
CREATE TABLE promotion (
promotion Varchar NOT NULL,
PRIMARY KEY (promotion)
);
| sale_id |
|---|
| 10% |
| 20% |
| 30% |
和銷售表:
CREATE TABLE sale (
sale_id int NOT NULL AUTO_INCREMENT,
promotion Varchar,
date Date NOT NULL,
amount int,
PRIMARY KEY (sale_id)
);
| sale_id | 晉升 | 日期 | 數量 |
|---|---|---|---|
| 1 | 無效的 | 2022-1-1 | 100 |
| 2 | 10% | 2022-1-1 | 100 |
| 3 | 10% | 2022-1-1 | 100 |
| 4 | 20% | 2022-1-1 | 100 |
| 5 | 無效的 | 2022-1-2 | 100 |
| 6 | 10% | 2022-1-2 | 100 |
| 7 | 30% | 2022-1-2 | 100 |
| 8 | 30% | 2022-1-2 | 100 |
其中promotion_id 是promotion 表的外鍵。所以關系是每個銷售可以沒有促銷(null)或促銷(促銷的主鍵的int id值作為外鍵)。
我正在嘗試按月顯示資料組然后進行促銷,其中每個月都有一堆按促銷分組的分組銷售總額。
到目前為止,我有這個查詢:
select
Month(date),
ifnull(promotion,'No Promo'),
sum(amount)
from sale
left join promotion p on p.promotion = sale.promotion
group by Month(date), sale.promotion
這給了我以下結果:
| 月 | 晉升 | 數量 |
|---|---|---|
| 1 | 無效的 | 100 |
| 1 | 10% | 200 |
| 1 | 20% | 100 |
| 2 | 無效的 | 100 |
| 2 | 10% | 100 |
| 2 | 30% | 200 |
但我想要的是:
| 月 | 晉升 | 數量 |
|---|---|---|
| 1 | 無效的 | 100 |
| 1 | 10% | 200 |
| 1 | 20% | 100 |
| 1 | 30% | 0 |
| 2 | 無效的 | 100 |
| 2 | 10% | 100 |
| 2 | 20% | 0 |
| 2 | 30% | 200 |
做一個正確的連接不意味著包括促銷表中促銷串列中的每一個促銷嗎?不管那個月是否有促銷活動?誰能給我一個正確方向的提示,說明為什么我的右連接不起作用?
uj5u.com熱心網友回復:
您需要反轉連接中表的順序。(右連接也可以,但并非所有版本都支持)
select
Month(date),
ifnull(promotion,'No Promo'),
sum(amount)
from promotion p
left join sale on p.promotion = sale.promotion
group by Month(date), ifnull(promotion,'No Promo');
uj5u.com熱心網友回復:
我們需要將提升中的約束從主鍵更改為唯一以允許空值。然后,我們可以使用交叉連接來創建所有行,并使用 left join to sale 來檢索所售商品的價值。
CREATE TABLE promotion ( promotion Varchar(4) UNIQUE );?
INSERT INTO promotion VALUES (null),('10%'),('20%'),('30%');?
CREATE TABLE sale ( sale_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, promotion Varchar(4), date_ Date NOT NULL, amount int );?
insert into sale (promotion, date_, amount) values (null,'2022-1-1',100), ('10%','2022-1-1',100), ('20%','2022-1-1',100), ('30%','2022-1-1',100), (null,'2022-1-2',100), ('10%','2022-1-2',110), ('20%','2022-1-2',120), ('30%','2022-1-2',130), (null,'2022-2-1',75), ('10%','2022-2-1',75), ('30%','2022-2-1',75), (null,'2022-2-2',75), ('10%','2022-2-2',75), ('30%','2022-2-2',75);?
select Month(date_) month_, ifnull(p.promotion,'No Promo') Promotion, sum(amount) Total from sale left join promotion p on p.promotion = sale.promotion group by Month(date_), ifnull(p.promotion,'No Promo');月_ | 促銷 | 全部的 -----: | :-------- | ----: 1 | 沒有促銷 | 200 1 | 10% | 210 1 | 20% | 220 1 | 30% | 230 2 | 沒有促銷 | 150 2 | 10% | 150 2 | 30% | 150
select m, ifnull(p.promotion,'No Promo') Promotion, sum(amount) Total from (select distinct month(date_) m from sale) m cross join promotion p left join sale s on m.m = month(date_) and p.promotion = s.promotion group by m, ifnull(p.promotion,'No Promo') order by m, ifnull(p.promotion,'No Promo');;米 | 促銷 | 全部的 -: | :-------- | ----: 1 | 10% | 210 1 | 20% | 220 1 | 30% | 230 1 | 沒有促銷 | 無效的 2 | 10% | 150 2 | 20% | 無效的 2 | 30% | 150 2 | 沒有促銷 | 無效的
db<>在這里擺弄
uj5u.com熱心網友回復:
我稍微修改了您的查詢和表定義,并在 dbFiddle 中正常作業。
CREATE TABLE promotion ( promotion Varchar(4) NOT NULL PRIMARY KEY );?
INSERT INTO promotion VALUES ('10%'),('20%'),('30%');?
CREATE TABLE sale ( sale_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, promotion Varchar(4), date_ Date NOT NULL, amount int );?
insert into sale (promotion, date_, amount) values (null,'2022-1-1',100), ('10%','2022-1-1',100), ('20%','2022-1-1',100), ('30%','2022-1-1',100), (null,'2022-1-2',100), ('10%','2022-1-2',110), ('20%','2022-1-2',120), ('30%','2022-1-2',130), (null,'2022-2-1',75), ('10%','2022-2-1',75), ('20%','2022-2-1',75), ('30%','2022-2-1',75), (null,'2022-2-2',75), ('10%','2022-2-2',75), ('20%','2022-2-2',75), ('30%','2022-2-2',75);?
select Month(date_) month_, ifnull(p.promotion,'No Promo') Promotion, sum(amount) Total from sale left join promotion p on p.promotion = sale.promotion group by Month(date_), ifnull(p.promotion,'No Promo');月_ | 促銷 | 全部的 -----: | :-------- | ----: 1 | 沒有促銷 | 200 1 | 10% | 210 1 | 20% | 220 1 | 30% | 230 2 | 沒有促銷 | 150 2 | 10% | 150 2 | 20% | 150 2 | 30% | 150
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/484596.html
