【问题标题】:SQL Server: Sum distinct multiple columns except one without using nested/sub queriesSQL Server:在不使用嵌套/子查询的情况下对不同的多列求和
【发布时间】:2019-08-07 13:43:02
【问题描述】:

我有一个产生以下结果的查询:

SQL Server 查询

SELECT DISTINCT com.CompanyID,c.Category,p.ModelNo,p.ProductCode,sum(sipl.SubTotal) AS Qty
FROM    SalesInvoiceProductsList AS sipl 
        INNER JOIN SalesInvoice AS s ON sipl.SalesInvoiceID = s.SalesInvoiceID 
        INNER JOIN Product AS p ON sipl.ProductID = p.ProductID 
        INNER JOIN Company AS com ON p.CompanyID = com.CompanyID 
        INNER JOIN Category AS c ON p.CatID = c.CatID
WHERE  (s.DateSold ='2019-02-04')
GROUP BY  p.ModelNo,sipl.SubTotal,p.ProductCode,com.CompanyID, c.Category
order by com.CompanyID

查询结果

CompanyID      Category          ModelNo    ProductCode       Qty
---------------------------------------------  -------------------

Gree        Fridge Invertor        1105        ghi             2
Gree        Fridge Invertor        1105        ghi             6
PEL         AC Invertor            1103        abc             1

我想要以下结果,但不使用嵌套/子查询,因为嵌套选择语句在使用 RDLC report of C# 时由于未知原因导致日期格式错误。所以简而言之,我需要以下结果而不使用嵌套的select 语句

期望的结果

CompanyID      Category          ModelNo    ProductCode       Qty
---------------------------------------------  -------------------

Gree        Fridge Invertor        1105        ghi             8
PEL         AC Invertor            1103        abc             1

以下查询会产生所需的结果,但与 C# RDLC 一起使用时会出现日期格式错误。

使用多选语句的不需要的查询

SELECT b.CompanyID, b.Category, a.ModelNo, a.ProductCode, a.Qty
FROM     (SELECT s.DateSold, p.ProductID, p.ModelNo, p.ProductCode, SUM(sipl.SubTotal) AS Qty
          FROM SalesInvoiceProductsList AS sipl 
          INNER JOIN SalesInvoice AS s ON sipl.SalesInvoiceID = s.SalesInvoiceID 
          INNER JOIN  Product AS p ON sipl.ProductID = p.ProductID
           GROUP BY p.ModelNo, p.ProductCode, p.ProductID, s.DateSold) AS a 
INNER JOIN
           (SELECT DISTINCT p.ProductID, p.CompanyID, cat.Category
            FROM  Product AS p 
            INNER JOIN Category AS cat ON p.CatID = cat.CatID 
            INNER JOIN Company AS c ON p.CompanyID = c.CompanyID) AS b ON a.ProductID = b.ProductID

group by  b.CompanyID, b.Category, a.ModelNo, a.ProductCode, a.Qty,a.DateSold 
having a.DateSold = '2019-02-04'

【问题讨论】:

  • 您的第一个查询“不起作用”,因为您尝试对 sipl.SubTotal 求和,但您还将该列包含在 group by 子句中。您在该查询中有一个根本缺陷。将 DISTINCT 添加到它是修复它的一个工具,但它不起作用。 Gordon 没有特别说明就解决了这个问题。

标签: sql sql-server


【解决方案1】:

我认为你只需要修复GROUP BY

SELECT com.CompanyID, c.Category, p.ModelNo, p.ProductCode,
       sum(sipl.SubTotal) AS Qty
FROM SalesInvoiceProductsList sipl JOIN
     SalesInvoice s
     ON sipl.SalesInvoiceID = s.SalesInvoiceID JOIN
     Product p JOIN
     ON sipl.ProductID = p.ProductID 
     Company com
     ON p.CompanyID = com.CompanyID JOIN
     Category c
     ON p.CatID = c.CatID
WHERE  s.DateSold ='2019-02-04'
GROUP BY com.CompanyID, c.Category, p.ModelNo, p.ProductCode
order by com.CompanyID

【讨论】:

  • 对不起,我忘记 sum(sipl.SubTotal) 为特定的 where 子句条件提供了不必要的总和。
  • 其中 s.DateSold='2019-03-15' 产生结果 Qty= 3,4,2,2 而正确的结果是 Qty=3,2,1,1
【解决方案2】:

使用窗口函数代替分组:

SELECT DISTINCT com.CompanyID,c.Category,p.ModelNo,p.ProductCode,
       SUM(sipl.SubTotal) OVER(PARTITION BY p.ModelNo, com.CompanyID,c.Category,p.ModelNo,p.ProductCode) AS Qty
FROM    SalesInvoiceProductsList AS sipl 
        INNER JOIN SalesInvoice AS s ON sipl.SalesInvoiceID = s.SalesInvoiceID 
        INNER JOIN Product AS p ON sipl.ProductID = p.ProductID 
        INNER JOIN Company AS com ON p.CompanyID = com.CompanyID 
        INNER JOIN Category AS c ON p.CatID = c.CatID
WHERE  (s.DateSold ='2019-02-04')
order by com.CompanyID

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多