根据另一列中的值添加一列中的给定值

问题描述 投票:0回答:1

我正在尝试使用 SQL 生成汽车销售报告。

报告必须按客户和期间进行分组和排序(格式 M/yyyy)

报告结果表必须有以下列:

  • 客户:购买车辆的客户。
  • 期限:销售日期。
  • 汽车数量:该客户在该时段内销售的车辆数量,类型为Car。
  • 汽车总价:该期间内向该客户出售的车辆(含车型)的价格总和。
  • 卡车数量:该客户在该时段内销售的车辆数量,类型为卡车。
  • 卡车总价:该期间内向该客户销售的车辆(含卡车类型)的价格总和。

您可以在这里找到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 值的额外行。我希望混合按客户和期间分组的两条线,如上所示。

sql sql-server
1个回答
0
投票

您需要从分组中删除

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);
© www.soinside.com 2019 - 2024. All rights reserved.