[英]Query is returning to rows instead of just one
我有一个查询以返回 M2(平方米)和 UN(单位)的 package 的尺寸。 对于当前查询,它返回两条不同的行,因为我使用的是CASE WHEN
。 这是查询:
SELECT DISTINCT(C.Package) 'Package',
CASE S.Unity WHEN 'M2' THEN SUM(L.Qt*S.ConvEst) ELSE NULL END 'M2',
CASE S.Unity WHEN 'UN' THEN SUM(L.Qt) ELSE NULL END 'UN'
FROM
PackageTable AS C
INNER JOIN
PackageTableRows L ON L.Package = C.Package
INNER JOIN
Products S ON S.Product = L.Product
WHERE
C.Package = '587496'
GROUP BY
C.Package, S.Unity
这个结果:
但我真正想要的是返回的查询是这样的:
只有一条线。 我知道我没有正确使用CASE WHEN
,这就是我需要你帮助的原因。
你在这里有几个问题。 首先, DISTINCT
不是function 它是一个运算符。 DISTINCT
影响整个数据集并导致仅返回不同的行。 它不是DISTINCT ({Column Name})
它是SELECT DISTINCT {Columns}
。
接下来,您同时拥有DISTINCT
和GROUP BY
; 这是一个缺陷。 GROUP BY
子句已经导致您的数据以不同的组返回,因此DISTINCT
既是多余的又是不必要的开销。 摆脱DISTINCT
。 如果您在使用GROUP BY
的DISTINCT
时得到不同的结果,这强烈表明您的GROUP BY
子句是错误的并且需要解决(很可能子句中的列太多)。
最后,在执行条件聚合时,聚合 function 应该围绕整个CASE
表达式,而不是THEN
中的表达式。 然后也意味着您需要从GROUP BY
中删除WHEN
子句中的列,因为我怀疑您拥有它的唯一原因是因为您必须:
这导致:
SELECT C.Package AS Package,
SUM(CASE S.Unity WHEN 'M2' THEN L.Qt * S.ConvEst END) AS M2,
SUM(CASE S.Unity WHEN 'UN' THEN L.Qt END) AS UN
FROM dbo.PackageTable C
INNER JOIN dbo.PackageTableRows L ON L.Package = C.Package
INNER JOIN dbo.Products S ON S.Product = L.Product
WHERE C.Package = '587496'
GROUP BY C.Package;
大部分是正确的。 您只需对 C.Package 进行 GROUP BY 即可将其合并到一行中。 为此,对于 case else 条件,它应该返回 0,并且聚合应该在完整的 case 条件下,而不仅仅是在度量上。
所以它看起来像这样。
SELECT C.Package 'Package',
SUM(CASE S.Unity WHEN 'M2' THEN (L.Qt*S.ConvEst) ELSE 0 END ) as 'M2',
SUM(CASE S.Unity WHEN 'UN' THEN SL.Qt ELSE 0 END) AS 'UN'
FROM PackageTable AS C
INNER JOIN PackageTableRows L ON L.Package=C.Package
INNER JOIN Products S ON S.Product=L.Product
WHERE C.Package='587496'
GROUP BY C.Package
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.