2017-07-27 5 views
1

私は、各注文の顧客ごとに、特定の部品番号の注文数を数えなければならないテーブルを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

あなたは1つのクエリであまりにも多くの操作をしようとしています。あなたが取るべきアプローチは、すべてのデータをまとめて必要な値を合計するマスター表/ビューを使って、一時表を作成することです。そのような:

次にUNIONを行う(ここでは、フィールドを集める) 表tmp3861を作成します(ここでは、フィールドを集める) ...(ここでは、フィールドを集める)

を表tmp3865をCREATE TABLEのtmp3860をCREATE

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

と表示または他のマスター一時テーブルにそれらを挿入します。 次に、そのViewまたはMaster Tempテーブルで合計を行います。

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+', 

あなたは、各sum()のために(over()を追加)これを実行する必要があります。

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