2012-01-02 10 views
0

以下は、指定された日付の間の週数を表示するスクリプトです。カラムとして週を表示する

SET DATEFIRST 1  
SELECT ta.account, ta.customer, SUM(amount), DATEPART(ww,ta.dt) WeekNumber 
FROM tablename ta 
WHERE dt >= '12/01/2011 00:00:00' 
     and dt < '12/29/2011 00:00:00' 
GROUP BY ta.account, ta.customer, DATEPART(ww,ta.dt) 

diffの週を結果に表示するにはどうすればよいですか?どんな提案も役に立ちます。

サンプルO /上記のためのPは次のとおりです。

Date  Account Customer TotalSeconds Amount WeekNumber45 WeekNumber46 WeekNumber47 WeekNumber8 WeekNumber49 

と、それに対応するデータ:

Date Account   Customer TotalSeconds Amount WeekNumber 

2011-11-01 xx0918252 198303792R 394   2.99 45 
2011-11-08 xx1006979 200100567G 92   0.16 46 
2011-11-15 xx1005385 A6863744I 492   1.275 47 
2011-11-21 xx1012872 D7874694G 770   0.52 48 
2011-11-28 xx1006419 C7112151H 1904  2.64 49 
2011-11-28 xx1006420 G7378945A 77   0.3  49 

私のようなO/Pを求めています。あなたは私の質問を理解したいと思っています。前もって感謝します。

こんにちはすべて、提案nアドバイスありがとうございます。最後に、私はしばらくの間、私が望んでいた結果を得ました。私はまだそれが難しいコーディングだと考えています。これにはより良い解決策がありますか?前もって感謝します。私のコードは次の通りです:

SELECT ta.account, ta.customer, 
isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '49' THEN amount END),0) AS "Week49", 

isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '50' THEN amount END),0) AS "Week50", 

isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '51' THEN amount END),0) AS "Week51", 

isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '52' THEN amount END),0) AS "Week52", 

isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '53' THEN amount END),0) AS "Week53", 

FROM (
select * from tablename 
where dt >= '12/01/2011 00:00:00' and dt <= '12/31/2011 00:00:00' 
) ta 
group by ta.account, ta.customer 

答えて

0

PIVOT機能を見てください。動的SQLと組み合わせ

Tsql pivot command

+1

ピボットの問題は、列の名前を事前に指定できる必要があることです。これは、sandysmithが問題の日付をハードコーディングしたい場合にのみ有効です。 –

+0

@ジェラルド:そうですね。入力の日付が違うかもしれないし、週番号もあらかじめわかっていないので、それが私の望むものではない。 – sandysmith

1

私は後の計算のために一時テーブルにあなたの結果をかけることになりまず。

if object_id('tempdb..#tab') is not null drop table #tab 

;with cte (Date,Account,Customer,TotalSeconds,Amount,WeekNumber) as (
    select cast('20111101' as datetime),'xx0918252','198303792R',394,2.99,45 union all 
    select '20111108','xx1006979','200100567G',92,0.16,46 union all 
    select '20111115','xx1005385','A6863744I',492,1.275,47 union all 
    select '20111121','xx1012872','D7874694G',770,0.52,48 union all 
    select '20111128','xx1006419','C7112151H',1904,2.64,49 union all 
    select '20111128','xx1006420','G7378945A',77,0.3,49 
) 
select * into #tab from cte 

今、あなたの計算されたデータは#tabテーブルにあり、次のクエリが返すが、それらのweeknumber秒台を旋回さ::このクエリの

select date, account, customer, totalSeconds, amount, [45], [46], [47], [48], [49] from 
(
    select date, account, customer, totalSeconds, amount, weeknumber as weeknumber from #tab 
) src 
pivot 
(
    max(weeknumber) for weekNumber in ([45], [46], [47], [48], [49]) 
) pvt 

ダイナミックバージョンが見えるかもしれないのは、CTEを以下は、あなたの結果であることを想像してみましょうこのような:

declare @sql nvarchar(max), @cols varchar(max) 

select @cols = coalesce(@cols + ',', '') + '[' + cast(weeknumber as varchar) + ']' 
from (select distinct weeknumber from #tab) t 
order by weeknumber 

set @sql = N' 
    select date, account, customer, totalSeconds, amount, ' + @cols + ' from 
    (
     select date, account, customer, totalSeconds, amount, weeknumber as weeknumber from #tab 
    ) src 
    pivot 
    (
     max(weeknumber) for weekNumber in (' + @cols + ') 
    ) pvt 
' 

exec sp_executesql @sql 

(両方の場合に)結果:

date     account customer totalSeconds amount  45  46  47  48  49 
----------------------- --------- ---------- ------------ ---------- ------ ------ ------ ------ ------ 
2011-11-01 00:00:00.000 xx0918252 198303792R 394   2.990  45  NULL NULL NULL NULL 
2011-11-08 00:00:00.000 xx1006979 200100567G 92   0.160  NULL 46  NULL NULL NULL 
2011-11-15 00:00:00.000 xx1005385 A6863744I 492   1.275  NULL NULL 47  NULL NULL 
2011-11-21 00:00:00.000 xx1012872 D7874694G 770   0.520  NULL NULL NULL 48  NULL 
2011-11-28 00:00:00.000 xx1006419 C7112151H 1904   2.640  NULL NULL NULL NULL 49 
2011-11-28 00:00:00.000 xx1006420 G7378945A 77   0.300  NULL NULL NULL NULL 49 
+0

こんにちはMichal、努力をいただきありがとうございます。私はSQLに慣れていないので、あなたの質問を理解することがほとんどできませんでした。しかし、まだそれに取り組んでいます。もう一度ありがとう。 – sandysmith

+0

@sandysmith最も重要なことは['pivot'](http://msdn.microsoft.com/en-us/library/ms177410.aspx)です - これは最初のクエリで使用されています。これは有限この特定のケースでは 'weeknumber'sのように、列に転置しようとしている値の数です。クエリーを書く瞬間に明らかになっていないときに、取得するカラム数と取得するカラムは、カラム 'weeknumber'にあるカラム名*のみ*を生成する2番目のクエリで解決されます。 –

+0

最も重要なことは['pivot'](http://msdn.microsoft.com/en-us/library/ms177410.aspx)です - 最初のクエリで使用されています。この特定のケースでは 'weeknumber'sのように、列に転置しようとする値があります。クエリーを書く瞬間に明らかになっていないときに、取得するカラム数と取得するカラムは、カラム 'weeknumber'にあるカラム名*のみ*を生成する2番目のクエリで解決されます。 –

関連する問題