[英]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.