2017-07-27 161 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