2017-08-28 72 views
0

我有一些SQL,我需要它根據四個變量(supplier_code,building_code,part_name,part_no)來合計數量。問題出在select語句中,我需要使用CASE語句根據transfer_date選擇建築物。但通過這樣做,我現在必須使用Group By中的transfer_date,然後生成三個不同的行....我需要這些行進行組合。如何組合GROUP BY子句中的行使用SQL

例如 -

enter image description here

的三個值與納皮爾應結合但不是因爲我不得不使用transfer_date組分析研究。

enter image description here

如何解決這個問題在下面的SQL。考慮到這是UPDATE的一部分,所以使用CTE不起作用。

SELECT 
    Part_Name, 
    Part_No, 
    Supplier_Code, 
    CASE WHEN Transfer_Date > @EndDate THEN Transfer_Building ELSE Building_Code END AS 'Building_Code', 
    SUM(Quantity) AS 'Incoming_Quantity' 
FROM Inventory 
WHERE 
    Regrade = 0 AND 
    (CASE WHEN Transfer_Date <= @EndDate THEN Transfer_Date ELSE Add_Date END <= @EndDate) AND 
    (Add_Date >= @StartDate OR Transfer_Date >= @StartDate) AND 
    Supplier_Code = 'TPP HAMSTEAD' AND Part_No = 'L32730' 
GROUP BY 
    Transfer_Date, 
    Supplier_Code, 
    Building_Code, 
    Transfer_Building, 
    Part_Name, 
    Part_No 

我可以使用臨時表,但想知道是否有更簡單的方法來實現這一目的?

+2

不羣的轉移日期。按整個案例分組。從select語句中除SUM以外的所有內容,並將其放入組中。同時從您的選擇中刪除Transfer_Date。如果你在那裏需要它,那麼你需要決定如何聚合它。 MAX? –

+0

我必須留下的轉帳日期,但通常不包括在內。現在將刪除。你應該把它作爲答案。 – Danrex

+0

Nick在他的評論中給出了答案 - 將CASE陳述放在組中,並刪除Transfer_Date。 – cddt

回答

0

下面是一個T-SQL的解決方案(SQL Server)的

SELECT 
    Part_Name, 
    Part_No, 
    Supplier_Code, 
    CASE 
    WHEN Transfer_Date > @EndDate 
    THEN Transfer_Building 
    ELSE Building_Code END AS 'Building_Code', 
    SUM(Quantity) AS 'Incoming_Quantity' 
FROM Inventory 
WHERE 
    Regrade = 0 AND 
    (CASE WHEN Transfer_Date <= @EndDate THEN Transfer_Date 
    ELSE Add_Date END <= @EndDate) 
    AND 
    (Add_Date >= @StartDate OR Transfer_Date >= @StartDate) 
    AND Supplier_Code = 'TPP HAMSTEAD' 
    AND Part_No = 'L32730' 
GROUP BY 
    Supplier_Code, 
    Part_Name, 
    Part_No, 
    CASE 
    WHEN Transfer_Date > @EndDate 
    THEN Transfer_Building 
    ELSE Building_Code END 
+0

只需注意,不指定dbms,但您的查詢不符合ANSI SQL標準。 (GROUP BY情況下的表達...) – jarlh

+0

Ture。我會添加更多的答案 –

相關問題