我正在尝试使用 SQL 生成汽车销售报告。
报告必须按客户和期间进行分组和排序(格式 M/yyyy)
报告结果表必须有以下列:
您可以在这里找到SQL转储文件来生成数据库和数据:
这是我尝试生成报告时使用的查询:
SELECT c.Name_Customer AS 'Customer', FORMAT(v.Sell_Date, 'M/yyyy') AS 'Period',
CASE
WHEN t.Name_Vehicle_Type = 'Car' THEN (COUNT(v.ID_Vehicle)) ELSE NULL END AS 'Cars quantity',
CASE
WHEN t.Name_Vehicle_Type = 'Car' THEN SUM(v.Sell_Price) ELSE NULL END AS 'Cars total price',
CASE
WHEN t.Name_Vehicle_Type = 'Truck' THEN (COUNT(v.ID_Vehicle)) ELSE NULL END AS 'Trucks quantity',
CASE
WHEN t.Name_Vehicle_Type = 'Truck' THEN SUM(v.Sell_Price) ELSE NULL END AS 'Trucks total price'
FROM Customer AS c, Vehicle AS v, Vehicle_Type AS t
WHERE c.ID_Customer = v.ID_Customer and v.ID_Vehicle_Type = t.ID_Vehicle_Type
GROUP BY v.ID_Customer, FORMAT(v.Sell_Date, 'M/yyyy'), c.Name_Customer, v.ID_Customer, t.Name_Vehicle_Type
HAVING (t.Name_Vehicle_Type = 'Car' or t.Name_Vehicle_Type = 'Truck')
ORDER BY c.Name_Customer, 'Period'
这是我运行查询时得到的结果:
客户 | 期间 | 汽车qnt | 汽车总价 | 卡车qnt | 卡车总价 | ** |
---|---|---|---|---|---|---|
简·多伊 | 2/2023 | 2 | 53000.00 | 空 | 空 | |
简·多伊 | 2/2023 | 空 | 空 | 2 | 380000.00 | |
简·多伊 | 4/2023 | 2 | 27000.00 | 空 | 空 | |
简·多伊 | 4/2023 | 空 | 空 | 2 | 137990.00 | |
杰森圣 | 5/2023 | 2 | 72500.00 | 空 | 空 | |
杰森圣 | 5/2023 | 空 | 空 | 2 | 330000.00 | |
杰森圣 | 8/2023 | 1 | 25000.00 | 空 | 空 | |
杰森圣 | 8/2023 | 空 | 空 | 1 | 57990.00 | |
迈克·芬 | 6/2023 | 3 | 93500.00 | 空 | 空 | |
迈克·芬 | 6/2023 | 空 | 空 | 2 | 330000.00 |
但我期待收到:
客户 | 期间 | 汽车qnt | 汽车总价 | 卡车qnt | 卡车总价 | ** |
---|---|---|---|---|---|---|
简·多伊 | 2/2023 | 2 | 53000.00 | 2 | 380000.00 | |
简·多伊 | 4/2023 | 2 | 27000.00 | 2 | 137990.00 | |
杰森圣 | 5/2023 | 2 | 72500.00 | 2 | 330000.00 | |
杰森圣 | 8/2023 | 1 | 25000.00 | 1 | 57990.00 | |
迈克·芬 | 6/2023 | 3 | 93500.00 | 2 | 330000.00 |
你能看出问题所在吗?它在某些单元格中生成带有 NULL 值的额外行。我希望混合按客户和期间分组的两条线,如上所示。
您需要从分组中删除
Name_Vehicle_Type
,而使用条件聚合。
还有:
[]
引用列名称,而不是 ''
。ELSE NULL
实际上并不是必需的,它是默认的。EOMONTH
按月分组,而不是 FORMAT
,因为字符串排序不正确并且速度很慢。IN
比 OR
短,尽管它编译为相同的东西。HAVING
,否则使用 WHERE
。服务器通常可以将其推送到较低级别,但最好明确。SELECT
c.Name_Customer AS Customer,
EOMONTH(v.Sell_Date AS Period,
COUNT(CASE WHEN t.Name_Vehicle_Type = 'Car' THEN 1 END) AS [Cars quantity],
SUM (CASE WHEN t.Name_Vehicle_Type = 'Car' THEN v.Sell_Price END) AS [Cars total price],
COUNT(CASE WHEN t.Name_Vehicle_Type = 'Truck' THEN 1 END) AS [Trucks quantity],
SUM (CASE WHEN t.Name_Vehicle_Type = 'Truck' THEN v.Sell_Price END) AS [Trucks total price]
FROM Customer AS c
JOIN Vehicle AS v ON c.ID_Customer = v.ID_Customer
JOIN Vehicle_Type AS t ON v.ID_Vehicle_Type = t.ID_Vehicle_Type
WHERE t.Name_Vehicle_Type IN ('Car', 'Truck')
GROUP BY
c.ID_Customer,
c.Name_Customer,
EOMONTH(v.Sell_Date)
ORDER BY
c.Name_Customer,
EOMONTH(v.Sell_Date);