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 

В принципе каждый сотрудник может иметь разные значения для типа пищи, но может иметь несколько видов питания в один день. imp point - все виды еды для работника должны быть сгруппированы вместе в o/p, и все виды еды, имеющие значение, должны быть сдвинуты вверх. Спасибо заранее.

+0

не имеет смысла, почему у вас есть две записи для комбинации EmpId = 1 и Meal = brkfst. Когда вы делаете Pivot, вы должны выбрать что-то для группировки - из результатов вашего примера я предполагаю, что вы хотите группировать 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  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 есть 2 значения для завтрака для 1-го дня и 2 значения для завтрака на 2-й день, тогда 2 строки для сотрудника 1 с brkfast.if у него есть 3 значения для 1-го дня и 2 значения для дня 2 в brkfsast, тогда в o/p должно быть 3 строки с 3-м значением для дня 2 как null. Я хочу, чтобы o/p, как в моем исходном запросе. Есть ли другое решение, если это невозможно с помощью поворота и разделов? Благодаря! –

+0

@ user1202939 - хорошо, допустим, у вас есть два значения (A, B) для сотрудника 1 в день 1 на завтрак. У вас также есть одно значение (C) для сотрудника 1 на день2 на завтрак. Как вы определяете, какое значение записи (C) будет идти, A или B? –

+0

Он должен идти прямо к самому большому пустому слоту. Не имеет значения, если его A или B. Только комбинация сотрудников и еды должна соответствовать. –

Смежные вопросы