簡體   English   中英

查詢返回到行而不是一個

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

接下來,您同時擁有DISTINCTGROUP BY 這是一個缺陷。 GROUP BY子句已經導致您的數據以不同的組返回,因此DISTINCT既是多余的又是不必要的開銷。 擺脫DISTINCT 如果您在使用GROUP BYDISTINCT得到不同的結果,這強烈表明您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM