2017-01-15 10 views
1

私は過去12ヶ月間にわたって1000以上の期間を過ごした顧客に対して発生したすべての請求書を自分のテーブルから取得しようとしています。私は唯一の請求書INV-341453を取得する結果SQL - CASE WHENクエリ

SELECT 
    t.Customer, t.Invoice 
FROM 
    (SELECT 
     CI.Customer, CI.Invoice, CI.Date, 
     SUM(CASE 
       WHEN CI.Date > DATEADD(month, -12, getdate()) 
        THEN CI.Valuee 
       ELSE 0 
      END) as Net 
    FROM 
     CustomerInvoice CI 
    GROUP BY 
     CI.Customer, CISRV.Invoice, CISRV.Date) AS t 
GROUP BY 
    t.Customer, t.Invoice 
HAVING 
    SUM (t.Net) > 1000 

が、私はまた、INVを請求し表示したいと思い:

enter image description here

そして、私のクエリ:以下は私のテーブルは一例として、2人の顧客のためであります-346218号およびINV-349065号に記載されている。

私は間違っていますか?

答えて

1

使用ANSI標準のウィンドウ機能:「すべての請求書」により、

select ci.* 
from (select ci.*, 
      sum(ci.value) over (partition by ci.customer) as total_value 
     from CustomerInvoice CI 
     where CI.Date > DATEADD(month, -12, getdate()) 
    ) ci 
where total_value > 1000; 

、私はあなたが過去12ヶ月の間にものを意味すると仮定します。

+0

おかげゴードン それは働きます!非常に良い解決策と簡単なコード。 OVER句の詳細については、こちらをご覧ください。 – kikos87

0

あなたは1000年しきい値を超えてしまった顧客を識別するためにグループ化されたクエリを使用してこれを行うには、その後、それらの顧客のためのすべての請求書を表示することができます:

SELECT Customer, Invoice 
FROM CustomerInvoice 
WHERE Customer IN 
    (SELECT Customer 
    FROM CustomerInvoice 
    GROUP BY Customer 
    HAVING SUM(CASE WHEN CI.Date>DATEADD(month,-12,getdate()) THEN CI.Valuee ELSE 0 END) > 1000)