Запрос на объединение нескольких строк в отдельные строки с несколькими столбцами - PullRequest
4 голосов
/ 16 февраля 2011

Я не считаю себя полным новичком в SQL, но я уже два дня смотрю на эту проблему, включаю и выключаю, и начинаю думать, что, возможно, я!

Используя следующие две таблицы:

ID    Category
1     Animal
2     Color
3     Sport

Name    ID    Value
Fred    1     Cat
Fred    2     Blue
Fred    3     Football
Sally   1     Dog
Sally   3     Jogging
James   2     Green
Anne    3     Swimming

Мне не удалось найти какую-либо комбинацию команд group, sub-query, union, cte или pivot, которая объединит несколько строк, возвращенных из запроса '(ID = 1 или ID = 2)', в отдельные строки с несколькими столбцами.

например:.

where (ID=1 or ID=2)

Name     Animal    Color
Fred     Cat       Blue
Sally    Dog       NULL
James    NULL      Green

Может кто-нибудь сообщить мне, если есть эффективное решение SQL для этого, или я трачу свое время на то, что должно быть обработано кодом в отчете?

Спасибо

Ответы [ 3 ]

4 голосов
/ 16 февраля 2011

Здесь идет синтаксис PIVOT

SELECT Name,[1] as Animal, [2] as Color
FROM
(SELECT Name,Id,Value
    FROM Table) AS SourceTable
PIVOT
(
MIN(Value)
FOR Id IN ([1], [2])
) AS PivotTable;
2 голосов
/ 16 февраля 2011

Вы можете сделать это с помощью:

Select a.Name as Name, a.Value as Animal, c.Value as Color
 FROM
     (SELECT Name, Value 
        FROM table2 INNER JOIN table1 
             ON table2.ID = table1.ID AND table2.ID =1) as a 
     LEFT JOIN 
     (SELECT Name, Value 
        FROM table2 INNER JOIN table1 
          ON table2.ID = table1.ID AND table2.ID =2) as c
     ON a.Name = c.Name
UNION
Select c.Name as Name, a.Value as Animal, c.Value as Color
 FROM
     (SELECT Name, Value 
        FROM table2 INNER JOIN table1 
             ON table2.ID = table1.ID AND table2.ID =1) as a 
     RIGHT JOIN 
     (SELECT Name, Value 
        FROM table2 INNER JOIN table1 
          ON table2.ID = table1.ID AND table2.ID =2) as c
     ON a.Name = c.Name

Таблица 2 странная и не очень хорошо разработана.

1 голос
/ 16 февраля 2011
WITH filtered_table AS (
  SELECT Name, ID, Value
  FROM table2
  WHERE ID IN (1, 2)
)
SELECT
  t2.Name,
  Animal = MAX(CASE t1.ID WHEN 1 THEN ft.Value END),
  Color  = MAX(CASE t1.ID WHEN 2 THEN ft.Value END)
FROM (SELECT DISTINCT Name FROM filtered_table) t2
  INNER JOIN table1 t1 ON t1.ID IN (1, 2)
  LEFT JOIN filtered_table ft ON t2.Name = ft.Name AND t1.ID = ft.ID
GROUP BY t2.Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...