2015-04-22 2 views
1

Проблема заключается в том, что у меня есть таблица, в которой у меня есть несколько строк, как это:Sql Server - Группа строк

Name Container  DateOrder  HourOrder 
Test1 | Container1 | 04-21-2015 | 11:00 
Test1 | Container2 | 04-22-2015 | 16:00 
Test2 | Container2 | 04-15-2015 | 01:00 
Test3 | Container3 | 04-15-2015 | 15:00 

мне нужно сделать отчет по имени, даты и контейнеров ... как я могу сделать это, результат должен выглядеть следующим образом:

Name  | Container | Container2 | DateOrder | DateOrder2 | HourOrder | HourOrder2 
    Test1 | Container1 | Container2  | 04-21-2015 | 04-22-2015 | 11:00 | 16:00 
    Test2 | Container2 |    | 04-15-2015 |   | 01:00 
    Test3 | Container3 |    | 04-15-2015 |   | 15:00 

Также мне нужно знать, какая дата с какого контейнера, например, container1 дата DaterOrder1, любой предлагаешь?

+0

Вы в основном хотите конкатенации (агрегат) '' Container' и группу DateOrder' на 'name' - есть 2 способа сделать это: XML или CLR. Пример XML-решения: http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-sql-server –

+0

Я думаю, мы также можем использовать COALESCE для этого. ..Проверьте это: http://stackoverflow.com/questions/8700961/using-coalesce-function-to-make-values-separated-with-commas –

+0

Я думаю, что я сделал неверный пример, я отредактирую таблицы. – GeronaXx

ответ

1

Вы можете использовать ROW_NUMBER(), чтобы сделать что-то вроде этого

;WITH TestTable AS 
(
SELECT 'Test1' AS Name,'Container1' AS Container,'04-21-2015' AS DateOrder,'11:00' AS HourOrder 
UNION ALL SELECT 'Test1','Container2 ','04-22-2015 ','16:00' 
UNION ALL SELECT 'Test2','Container2 ','04-15-2015 ','01:00' 
UNION ALL SELECT 'Test3','Container3 ','04-15-2015 ','15:00' 
), 
CTE AS 
(
SELECT Name,Container,DateOrder,HourOrder,ROW_NUMBER()OVER(PARTITION BY Name ORDER BY Container ASC) rn 
FROM TestTable 
) 

SELECT 
    C1.Name, 
    C1.Container as Container, 
    C2.Container as Container2, 
    C1.DateOrder as DateOrder, 
    C2.DateOrder as DateOrder2, 
    C1.HourOrder as HourOrder, 
    C2.HourOrder as HourOrder2 
FROM CTE C1 
LEFT JOIN CTE C2 
    ON C1.Name = C2.Name 
     AND C1.rn + 1 = C2.rn 
WHERE C1.rn = 1 
+0

Это прекрасно работает, спасибо! – GeronaXx

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