2011-08-04 17 views
0

SQL Server 2008を使用していますが、この問題があります。異なる期間の合計金額を取得する方法

私は、ジョブフィールド、日付フィールド、コストフィールドを持つテーブルを持っています。日付フィールドには、特定のジョブで実行された日付が格納されますが、コストフィールドにはその日付に費やされた金額が保持されます(1つのジョブで数日かかることがあります)。

私は、異なるカラムでジョブを開くと0-7daysと8-30daysの間に費やされたコストの合計を得ます。それは、このような結果を表示する

select a.[Job No_], DATEDIFF(day, MIN(b.[Posting Date]), a.[Ending Date]) as [WIP Age], 
     SUM(b.[Total Cost])[Total WIP cost] 
    [0 - 7 days]=case 
     when (DATEDIFF(day, MIN(b.[Posting Date]), a.[Ending Date]) between 1 and 7) then 
      SUM(b.[Total Cost]) 
     else 0 
    end, 
    [8 - 30 days]=case 
     when (DATEDIFF(day, MIN(b.[Posting Date]), a.[Ending Date]) between 8 and 30) then 
      SUM(b.[Total Cost]) 
     else 0 
    end, 
    [> 30 days]=case 
     when (DATEDIFF(day, MIN(b.[Posting Date]), a.[Ending Date]) > 30) then 
      SUM(b.[Total Cost]) 
     else 0 
    end 
from [Job]a 
right join [Job Ledger Entry]b 
on b.[Job No_] = a.[No_] 
group by a.[No_] 

私はこれを試してみました - 7日、8

Job No_ WIP Age Total WIP cost 0 - 7 days 8 - 30 days > 30 days 
0001  40   9526.18   0   0    9526.18 
0002  27   1178.49   0  1178.49   0 
0003  3   2838.94  2838.94  0    0 

これは私が望むものではありません、私はすべてのコストが0の間で過ごしたいです - 30日および> 30日である。

+0

私は、列名にスペースとその他の文字を使用することに驚いています! 'ジョブ'テーブルには、ジョブの1日のコストのエントリが含まれていますか?したがって、毎日1つのジョブコストが転記され、複数の日に合計する必要があるジョブコスト全体を得ることができますか?また、 'Job Ledger Entry'テーブルの[[投稿日]]列は、特定の日に基づいてクエリするのに使用されていますか? –

+0

こんにちは、ブレント、ごめんなさい、スペースの使用。情報をより明確にするだけです。 'job'テーブルには各ジョブの詳細が含まれていますが、' Job Ledger Entry'にはそれぞれのジョブが異なる日に行うトランザクションが含まれています。例えば。ジョブ001は10日間トランザクションを持ち、毎日はコストに関係します(それぞれのトランザクションのエントリは 'job ledj entry table'に取り込まれます)。アイデアは、1-7日間、8-30日間など、ジョブ001で費やされた合計を知ることです。 – Abimbola

+0

私はおそらく考えを開始していますが、まだ確信が持てません。私は実際に出力に対応するソースデータのサンプルを歓迎します。 –

答えて

0

次は、より良い仕事をするかもしれません。

SELECT 
    a.[Job No_], 
    [WIP Age] = DATEDIFF(day, MIN(b.[Posting Date]), MAX(a.[Ending Date])), 
    [Total WIP cost] = SUM(b.[Total Cost]), 
    [0 - 7 days] = SUM(CASE 
    WHEN (DATEDIFF(DAY, b.[Posting Date], a.[Ending Date]) BETWEEN 1 AND 7) 
    THEN SUM(b.[Total Cost]) 
    END), 
    [8 - 30 days] = SUM(CASE 
    WHEN (DATEDIFF(DAY, b.[Posting Date], a.[Ending Date]) BETWEEN 8 AND 30) 
    THEN b.[Total Cost] 
    END), 
    [> 30 days] = SUM(CASE 
    WHEN (DATEDIFF(day, b.[Posting Date], a.[Ending Date]) > 30) 
    THEN b.[Total Cost] 
    END) 
FROM [Job] a 
    RIGHT JOIN [Job Ledger Entry] b ON b.[Job No_] = a.[No_] 
GROUP BY a.[No_] 

説明:私は、それぞれの総和内のすべてのCASE式を置きます。最初のDATEDIFFでMAX()をa.[Ending Date]にも適用しました。なぜなら、集計を行わずにその列を使用すると間違っているように見えるからです。

+0

あなたの返信ありがとうございます。しかし、列はヌル値を返します。アイデアは次のとおりです。ジョブテーブルには各ジョブの詳細が含まれていますが、ジョブ元帳エントリには、各ジョブが異なる日に行うトランザクションが含まれています。例えば。ジョブ001は10日間トランザクションを持ち、毎日コストの関係があります(それぞれのトランザクションのエントリはジョブのledjエントリテーブルに取り込まれます)。この考えは、1-7日間、8-30日間など、ジョブ001で費やされた合計を知ることです。投稿日の列は、トランザクションが行われた日です。 – Abimbola

関連する問題