2016-06-23 6 views
0

このクエリをあまり醜くする方法はありますか?私は、コードの重複を避けたいと私はコードのように小さな作品サブクエリにパラメータを渡す

select 
    CB.CompanyName as ClientName, 
    Sum30 = (
       select 
        sum(TotalAmount) as sum30 
       from 
        InvoiceBrowse 
       where 
        DATEDIFF(day, CreatedOn, @now) > @days_limit AND 
        DATEDIFF(day, CreatedOn, @now) <= 30 AND 
        ClientCompanyName = IB.ClientCompanyName 
      ), 
    Sum60 = (
       select 
        sum(TotalAmount) as sum30 
       from 
        InvoiceBrowse 
       where 
        DATEDIFF(day, CreatedOn, @now) > @days_limit AND 
        DATEDIFF(day, CreatedOn, @now) <= 60 AND 
        ClientCompanyName = IB.ClientCompanyName 
      ), 
    Sum90 = (
       select 
        sum(TotalAmount) as sum30 
       from 
        InvoiceBrowse 
       where 
        DATEDIFF(day, CreatedOn, @now) > @days_limit AND 
        DATEDIFF(day, CreatedOn, @now) <= 90 AND 
        ClientCompanyName = IB.ClientCompanyName 
      ) 
from 
    InvoiceBrowse IB 

いくつかの説明のためのストアド・プロシージャまたは関数を作成する必要はありません:私は、請求書を持つテーブルを持っており、それぞれの会社のために請求書の合計を計算します30 \ 60 \ 90日間。

+0

私が考えることのできる選択肢は「醜い」です。関数、ビュー、またはCTEがありますが、この小さな部分はあまり意味がない=) – Nikki9696

+0

スカラー関数を使用できます。https://msdn.microsoft.com/en-us/library/ms191320.aspx – Hackerman

+0

tsqlタグは重複していませんでした。ガイドラインはtsqlを使用することです。 – Paparazzi

答えて

3

あなたの例でテーブルが見つからないようですが、このようなものが動作する可能性があります。

SELECT ClientCompanyName AS ClientName, 
     SUM(CASE WHEN DATEDIFF(day,CreatedOn,@now) <= 30 THEN TotalAmount END) AS Sum30, 
     SUM(CASE WHEN DATEDIFF(day,CreatedOn,@now) <= 60 THEN TotalAmount END) AS Sum60, 
     SUM(CASE WHEN DATEDIFF(day,CreatedOn,@now) <= 90 THEN TotalAmount END) AS Sum90 
FROM InvoiceBrowse 
WHERE CreatedOn < DATEADD(DAY, [email protected]_limit, @now) 
GROUP BY ClientCompanyName 
関連する問題