【问题标题】:SQL Query with Group By statement使用 Group By 语句的 SQL 查询
【发布时间】:2016-09-10 09:37:30
【问题描述】:

我有这 4 张桌子:

经理、销售、销售详情、产品:

  • 经理:ID、姓名
  • 销售:ID、ManagerID、SaleNO、SaleDate
  • SaleDetails:ID、SaleID、ProductID、数量
  • 产品:ID、名称、价格

我想为每个经理检索:SaleDate 和唯一产品计数;

我的选择如下所示:

;WITH cte
AS
(
    SELECT sd.SaleID, sd.ProductID FROM dbo.Products p
        INNER JOIN dbo.SalesDetails sd ON sd.ProductID = p.ID
    GROUP BY sd.SaleID, sd.ProductID
)
SELECT
     c.Name AS ManagerName
    ,s.SaleDate
    ,COUNT(ct.ProductID) AS ProductCount
FROM cte ct
    INNER JOIN dbo.Sales s ON ct.SaleID = s.ID
    INNER JOIN dbo.Managers c ON c.ID = s.ConsultantID
GROUP BY s.SaleDate, c.Name

这是最优的吗?你能帮我用更优化的查询替换它吗

  • 经理:[ID = 1,姓名 = John;]
  • 销售:[ID = 1,ManagerID = 1,SaleNO = 0015,SaleDate:2016-09-08],[ID = 2,ManagerID = 1,SaleNO = 0016,SaleDate:2016-09-09]李>
  • SaleDetails: [ID = 1, SaleID = 1, ProductID = 1, Quantity = 2], [ID = 2, SaleID = 1, ProductID = 1, Quantity = 4], [ID = 3, SaleID = 1, ProductID = 2, Quantity = 3], [ID = 4, SaleID = 2, 产品 ID = 1,数量 = 3]
  • 产品:[ID = 1,名称 = Sony],[ID = 2,名称 = 三星]

查询必须返回结果:

  • ManagerName = John,SaleDate = 2016-09-08,ProductCount = 2
  • ManagerName = John,SaleDate = 2016-09-09,ProductCount = 1

【问题讨论】:

  • 您的查询是否有效,您是否要求替代方案?如果您正确设置了索引,则这些连接可能会非常有效地运行。
  • 是的,我想写一个替代查询。此查询有效
  • @www1986 你能把数据和预期结果发给你吗??
  • @JibinBalachandran 我编辑了我的帖子,你可以查看

标签: sql sql-server


【解决方案1】:
SELECT c.Name AS ManagerName
      ,s.SaleDate
      ,COUNT(p.ProductID)
FROM dbo.Products p
INNER JOIN dbo.SalesDetails sd ON sd.ProductID = p.ID
INNER JOIN dbo.Sales s ON sd.SaleID = s.ID
INNER JOIN dbo.Managers c ON c.ID = s.ConsultantID
GROUP BY s.SaleDate, c.Name,sd.ProductID

【讨论】:

  • @www1986 更新了我的答案,现在检查一下,如果您有任何问题,请告诉我。
【解决方案2】:

正确答案(当我阅读问题时)是:

SELECT c.Name AS ManagerName, s.SaleDate, COUNT(DISTINCT sd.ProductId)
FROM dbo.SalesDetails sd
     dbo.Sales s
     ON sd.SaleID = s.ID INNER JOIN
     dbo.Managers c
     ON c.ID = s.ConsultantID
GROUP BY s.SaleDate, c.Name;

注意事项:

  • 不需要Products 表,因为SalesDetails 表中有产品信息。
  • 产品 ID 不在 GROUP BY 中。
  • 正确的聚合函数是COUNT(DISTINCT)

【讨论】:

  • 是的,你是对的,但是如果想用产品价格过滤呢?例如 p.price > 500
  • @www1986 。 . .那不是你问的问题。在这种情况下,如果信息不在 salesdetails 中,您将需要产品表。
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多