2017-07-21 14 views
0

次のテーブルをピボットする必要があります。SQL Server 2008 R2:カウント付きピボットテーブル

CREATE TABLE Emp_Month 
(
    EMPID int, 
    [Month] varchar(10) 
); 

挿入

INSERT INTO Emp_Month VALUES(101,'July'); 
INSERT INTO Emp_Month VALUES(102,'June'); 
INSERT INTO Emp_Month VALUES(103,'May'); 
INSERT INTO Emp_Month VALUES(104,'April'); 
INSERT INTO Emp_Month VALUES(105,'March'); 

INSERT INTO Emp_Month VALUES(201,'July'); 
INSERT INTO Emp_Month VALUES(202,'July'); 
INSERT INTO Emp_Month VALUES(203,'June'); 
INSERT INTO Emp_Month VALUES(204,'July'); 
INSERT INTO Emp_Month VALUES(205,'June'); 

INSERT INTO Emp_Month VALUES(301,'January'); 
INSERT INTO Emp_Month VALUES(302,'January'); 
INSERT INTO Emp_Month VALUES(303,'February'); 
INSERT INTO Emp_Month VALUES(304,'February'); 
INSERT INTO Emp_Month VALUES(305,'February'); 

予想される出力:私はCOUNTを印刷したい(last_months_from_current_date)

Last_6_Month Last_5_Month Last_4_Month Last_3_Month Last_2_Month Last_1_Month 
-------------------------------------------------------------------------------------------- 
13    10    9    8    7    4 

を試しマイ:

select * 
from 
(
    SELECT t.Month,t.[Month] as Mon 
    FROM Emp_Month t 
) src 
pivot 
(
    COUNT(Mon) 
    for [Month] in ([Last_6_Month],[Last_5_Month],[Last_4_Month],[Last_3_Month],[Last_2_Month],[Last_1_Month]) 
) piv; 

しかし、すべてゼロの値を取得します。

select * 
from 
(
    SELECT t.Month,t.[Month] as Mon 
    FROM Emp_Month t 
) src 
pivot 
(
    COUNT(Mon) 
    for [Month] in ([Last_6_Month],[Last_5_Month],[Last_4_Month],[Last_3_Month],[Last_2_Month],[Last_1_Month]) 

) piv; 

をクエリに次の行が列内の実際の値を持っている必要があります:

+0

「Track_Table」と「Emp_Month」は同一であると仮定しますか?また、あなたのデータは実際に 'date'値ではなく月名を含む文字列ですか? –

+0

@Damien_The_Unbeliever、テーブル名を編集しました。そして、はい、その月は文字列です。 – MAK

+0

私は今あなたの期待している結果を見ていて、最後の6ヶ月に2〜7月のすべての行を含め、3〜7月のすべての行を最後の5ヶ月に含めることを望みます。そう? – Greenspark

答えて

1

これは私の頭を少しひねった。しかし、これはあなたが求めていることをするでしょう。

あなたが欠けていることは、実際の合計を行うことです、あなたはあなたのセットを注文するいくつかの方法が必要です。月の番号を得るための工事がここにあります。それは最高ではありませんが、例のために働いています。

実行中の集計をグループ化して実行した後、ピボットは一番上にありますが、あなたは1つを求めていました。それが役に立てば幸い。

(*私はそうでなければ、あなたは毎月これを変更する場合は、必要に応じていたピボット自己更新の列ヘッダーを作るために受け入れ答えにいくつかの変更を行いました。)

;WITH 
    MonthsCountedOrdered AS 
    (
     SELECT count(EMPID) empCount, Month, Datediff(M, [Month] + ' 1, 2017', getdate()) + 1 monthsPast 
     FROM Emp_Month 
     GROUP BY [Month] 
    ) 
    , RunningTotal AS 
    (
     SELECT 
      Month 
      , SUM(empCount) OVER (Order By monthsPast ROWS UNBOUNDED PRECEDING) tot 
      , 'Last_' + cast(monthsPast as varchar(2)) + '_Month' as ColumnHeader 
     FROM 
      MonthsCountedOrdered 
     WHERE 
      monthsPast <= 6 
    ) 

    SELECT * 
    FROM 
    (
     SELECT t.ColumnHeader,t.tot 
     FROM RunningTotal t 
    ) src 
    pivot 
    (
     Sum(tot) 
     for [ColumnHeader] in (Last_6_Month,Last_5_Month,Last_4_Month,Last_3_Month,Last_2_Month,Last_1_Month) 
    ) piv; 

結果:

Last_6_Month Last_5_Month Last_4_Month Last_3_Month Last_2_Month Last_1_Month 
------------ ------------ ------------ ------------ ------------ ------------ 
13   10   9   8   7   4 
+0

私は間違っているかもしれませんが、 '[Month] + '1、2017''をハードコーディングするのに問題があると思います - このコードは2017年の日付を扱うときにのみ機能します。 –

+1

@StanShawそれは間違いありません。私は特に、私の応答で日付論理が弱いことに注意しました。しかし、ソースデータは、何年になるかについての洞察を提供していないので、私たちは固執しています。 – Greenspark

+0

正確に - 彼は彼のサンプルデータに1年もなかったことに気づいた - 私はちょうど将来の読者のためにコメントを追加したい。 –

1

@MAKはここにあなたがしようとしたクエリです。あなたのサンプルからは、実際の月の名前がそこにあるかのように見えますが、あなた自身の価値を入れているので、数字は0になります。あなたが実際に持っている月の名前を入れてみてください。 [月間

:のような([Last_6_Month]、[Last_5_Month]、[Last_4_Month]、[Last_3_Month]、[Last_2_Month]、[Last_1_Month]

何かで[月]用

] [(6月]、[7月]、[4月])

+0

しかし、私は期待された結果に示されているように、最後の6,5,4,3,2,1ヶ月のカウントが欲しいです。 – MAK

+0

ピボットは、ピボットされた結果の列の名前としてテーブルの値を使用します。それが技術の仕組みです。列の名前を変更したい場合は、トップセレクトにエイリアスを付けます。 – Greenspark

0

私はまずEMPIDフィールドを月よりも数えていますが、両方ともこの場合には動作します。

また、月の列のデータがピボット内の列リストと一致しないため、ピボットができません。過去6か月間にピボット回転を見たい場合は、新しい列を追加するか、ビューまたはサブクエリを作成して[Last_6_Month]の値を持つ列を追加する必要があります

数ヶ月後、あなたは常にちょうど私がこれをした動的SQLのアプローチによって

SELECT * 
FROM 
(
    SELECT t.Month,EMPID 
    FROM Emp_Month t 
) src 
PIVOT 
(
    COUNT(EMPID) 
    FOR [Month] in (
    [January],[February],[March],[April],[May],[June],[July], 
    [August],[September],[October],[November],[December] 
) 
) piv; 
0

を使用することができ、これは

DECLARE @DynamicCol NVARCHAR(max), 
     @Sql  NVARCHAR(max) 

SELECT @DynamicCol = Stuff((SELECT DISTINCT ', ' + Quotename([month]) 
          FROM #emp_month 
          FOR xml path ('')), 1, 1, '') 

SET @Sql=N'SELECT ' + @DynamicCol + 'FROM 
      (
     SELECT t.[MONTH],COUNT(t.[Month]) AS Mon  
     FROM #Emp_Month t GROUP BY [MONTH] 
     )AS SRC 
     PIVOT 
     ( 
     MAX([Mon]) FOR [Month] IN (' + @DynamicCol + ') 
     ) AS PVT ' 

PRINT @Sql 

EXEC (@Sql) 

あなたはまた、以下のcondtion

を設定することができ、あなたの必要なコードであるかもしれません
関連する問題