我有一個查詢以 M2(平方米)和 UN(單位)為單位回傳包裹的尺寸。對于當前查詢,它回傳兩條不同的行,因為我使用的是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正確使用,這就是為什么我需要你的幫助。
uj5u.com熱心網友回復:
你在這里有幾個問題。首先,DISTINCT它不是一個函式,它是一個運算子。DISTINCT影響整個資料集并導致僅回傳不同的行。不是DISTINCT ({Column Name})它是SELECT DISTINCT {Columns}。
接下來,你都 DISTINCT和GROUP BY; 這是一個缺陷。一個GROUP BY條款已經引起中回傳的資料不同的群體,因此DISTINCT是冗余和不必要的開銷。擺脫DISTINCT. 如果您在DISTINCT使用 a時得到不同的結果,GROUP BY這強烈表明您的GROUP BY子句是錯誤的并且需要解決(很可能您的子句中有太多列)。
最后,在執行條件聚合時,聚合函式應該圍繞整個 CASE運算式,而不是THEN. 然后也意味著您需要WHEN從子句中洗掉該列,GROUP BY因為我懷疑您擁有它的唯一原因是因為您必須:
這導致:
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;
uj5u.com熱心網友回復:
大部分是正確的。你只需要在 C.Package 上 GROUP BY 把它變成一行。為此,它應該在其他情況下回傳 0,并且聚合應該在完整的情況下進行,而不僅僅是在度量上。
所以它看起來像這樣。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366934.html
標籤:sql sql-server
上一篇:將一張表插入另一張表
下一篇:MSSQLPivot資料來自多列
