2012-02-10 5 views
0

私はこのようなテーブルを持っている:のSQLピボット

EmpId--Meal--Day--Value 

1--Brkfst--1--10 

1--Brkfst--1--20 

1--Brkfst--2--30 

1--Lunch--3--40 

2--Brkfst--1--50 

2--Lunch--2--60 

2--Brkfst--1--70 

2--Brkfst--2--80 

出力は次のようになります。

EMPID--Meal--Day1--Day2--Day3 

1--brkfst--10--30--null 

1--brkfst--20--null-null 

1--lunch--null--null--40 

2--brkfst--50--80--null 

2--brkfst--70--null--null 

基本的には各従業員が食事のタイプごとに異なる値を持つことができますが、複数の食事の種類を持つことができます1日で impポイントは、従業員のすべての食事タイプをo/pで一緒に束ねる必要があり、値を持つすべての食事タイプを上にシフトする必要があります。 ありがとうございます。

+0

は意味がありません。あなたがピボットするときに、グループ化するものを選択する必要があります。例の結果から、あなたがそうではなくても、EmpIdとMealでグループ化したいと仮定しています。 –

答えて

0
DECLARE @someTable TABLE (empid INT, Meal VARCHAR(10), [Day] INT, Value INT); 

INSERT INTO @someTable(empid, Meal, [Day], Value) 
SELECT 1, 'Brkfst', 1, 10 UNION ALL 
SELECT 1, 'Brkfst', 1, 20 UNION ALL 
SELECT 1, 'Brkfst', 2, 30 UNION ALL 
SELECT 1, 'Lunch', 3, 40 UNION ALL 
SELECT 2, 'Brkfst', 1, 50 UNION ALL 
SELECT 2, 'Lunch', 2, 60 UNION ALL 
SELECT 2, 'Brkfst', 1, 70 UNION ALL 
SELECT 2, 'Brkfst', 2, 80; 

WITH SRC AS (
    SELECT empid, Meal, [Day], Value 
    FROM @someTable   
) 
SELECT empid, Meal, [1] AS Day1, [2] AS Day2, [3] AS Day3 
FROM SRC 
PIVOT(Sum(Value) FOR [Day] IN([1], [2], [3])) P 

結果:あなたはのEmpID = 1と食事=ブレックファストの組み合わせのための2つの記録を持っている理由

empid  Meal  Day1  Day2  Day3 
----------- ---------- ----------- ----------- ----------- 
1   Brkfst  30   30   NULL 
2   Brkfst  120   80   NULL 
1   Lunch  NULL  NULL  40 
2   Lunch  NULL  60   NULL 
+0

お返事ありがとうございます。 しかし、私は値を合計したくない。食事の値をそのまま表示したいと思う。従業員1が2日目の朝食に1日の朝食と2日の値を持っている場合は、 brkfastで従業員1の2行になります。彼は1日目に3つの値を持ち、brkfsastで2日目に2つの値を持っています。次にo/pに3行、2日目の3番目の値がnullになります。/p私の元の質問と同じです。ピボットとパーティションを使用することで不可能な場合は、他にも解決策はありますか?ありがとう! –

+0

@ user1202939 - okだから、朝食の1日目に従業員1の2つの値(A、B)があるとします。あなたはまた、朝食のための2日目に従業員1のために1つの値(C)を持っています。どのレコード価値(C)がAまたはBになるのかをどのように決定しますか? –

+0

それは一番上の最も空いているスロットにまっすぐに行かなければなりません。そのAまたはBの場合は問題ありません。従業員と食事の組み合わせだけが一致する必要があります。 –