2017-07-27 123 views
1

我有一個表格,必須爲每個訂單上的每個客戶計算特定零件編號的訂單數量。我得到錯誤SQL代碼SUM CASE語句

"Column 'ALL_INFORMATION.CUSTOMER_ID' is invalid in the select list because 
it is not contained in either an aggregate function or the GROUP BY clause." 

我不知道還有什麼要做。以下是我的代碼。我感謝任何和所有的幫助。

WITH ALL_INFORMATION 
    AS (SELECT CUSTOMER_ID, SO_ID, CHANGE_DATE, PART_ID, ORDER_QTY, PRODUCT_LINE FROM SOFBH), 
PRODUCT_QUANTITY 
AS (
    SELECT *, 
    sum(
     case when PART_ID = '3860+' then ORDER_QTY else 0 
    end) as '3860+', 
    sum(
     case when PART_ID = '3861' then ORDER_QTY else 0 
    end) as '3861', 
    sum(
     case when PART_ID = '3865' then ORDER_QTY else 0 
    end) as '3865', 
    sum(
     case when PRODUCT_LINE = '1055' then ORDER_QTY else 0 
    end) as '1055', 
    sum(
     case when PRODUCT_LINE = '1056' then ORDER_QTY else 0 
    end) as '1056', 
    sum(
     case when PRODUCT_LINE = '1057' then ORDER_QTY else 0 
    end) as '1057', 
    sum(
     case when PRODUCT_LINE = '1058' then ORDER_QTY else 0 
    end) as '1058' 
FROM ALL_INFORMATION) 


select * 
FROM ALL_INFORMATION 
GROUP BY CUSTOMER_ID, SO_ID 
+0

你使用的是什麼dbms? – Eric

+0

Microsoft SQL Server 2016 –

回答

1

你試圖在一個查詢中做太多的事情。我認爲您應該採取的方法是創建一些臨時表,並使用主表/視圖將所有數據集中在一起並彙總所需的值。像這樣:

CREATE TABLE tmp3860(收集,領域,在這裏) CREATE TABLE tmp3861(收集,領域,在這裏) CREATE TABLE tmp3865(收集,領域,在這裏)...

然後做一個UNION

SELECT * FROM tmp3860 UNION SELECT * FROM tmp3861 ...

,並將這些成查看或另一個主臨時表。 然後在該視圖或主臨時表中做你的總和

0

這是因爲你的SQL語句沒有在使用GROUP BY的地方使用任何聚合函數(SUM,AVG等)。

SELECT * 
    FROM ALL_INFORMATION 
GROUP BY CUSTOMER_ID, SO_ID 

是的,你在你的SQL中使用SUM()函數,但不是在使用GROUP BY的地方。

0

如果你想在每排總結值,然後利用窗口函數:

PRODUCT_QUANTITY as (
SELECT *, 
     sum(case when PART_ID = '3860+' then ORDER_QTY else 0 end) over() as '3860+', 

你需要這樣做(添加over())每個sum()

0

檢查下面的查詢,我認爲這是你需要的。

SELECT CUSTOMER_ID, SO_ID, 
sum(
    case when PART_ID = '3860+' then ORDER_QTY else 0 
end) as '3860+', 
sum(
    case when PART_ID = '3861' then ORDER_QTY else 0 
end) as '3861', 
sum(
    case when PART_ID = '3865' then ORDER_QTY else 0 
end) as '3865', 
sum(
    case when PRODUCT_LINE = '1055' then ORDER_QTY else 0 
end) as '1055', 
sum(
    case when PRODUCT_LINE = '1056' then ORDER_QTY else 0 
end) as '1056', 
sum(
    case when PRODUCT_LINE = '1057' then ORDER_QTY else 0 
end) as '1057', 
sum(
    case when PRODUCT_LINE = '1058' then ORDER_QTY else 0 
end) as '1058' 

FROM PRODUCT_QUANTITY GROUP BY CUSTOMER_ID, SO_ID