2012-02-10 57 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 

基本上每个雇员可具有不同的值用于膳食类型,但可以有多个膳食类型在一天之内。要点是所有膳食类型的员工应该聚集在一起,并且所有具有价值的膳食类型应该向上移动。 在此先感谢。

+0

没有意义,为什么你有两个记录的EmpID = 1和膳食= brkfst的组合。当你枢轴转动时,你必须选择一些东西来分组 - 从你的例子结果中,我假设你希望按EmpId和Meal分组,即使你不是。 – 2012-02-10 21:42:42

回答

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  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

感谢J Cooper的回复。 但是我不想总结这些价值。我想要显示所有膳食的价值,因此,如果员工1在第1天的早餐有2个值,第2天的早餐的值为2,那么应该有对于brkfast,如果员工1的行数为2行,如果他在brkfsast中有第1天的3个值和第2天的2个值,那么在o/p中应该有3行,第2天的第3个值为空。我想要o/p就像在我原来的查询。有没有其他的解决方案,如果它不可能通过使用枢轴和分区?谢谢! – 2012-02-13 11:54:07

+0

@ user1202939 - 好吧,让我们假设第1天的员工1有两个值(A,B)用于早餐。第2天的员工1的早餐也有一个价值(C)。你如何确定哪个记录值(C)与A或B一起? – 2012-02-13 13:49:51

+0

它应该直接进入最上面的空位。如果它的A或B,只有员工和膳食组合应该匹配,则无关紧要。 – 2012-02-13 16:13:30