2015-07-09 5 views
0

Я проделал некоторую работу в , казалось бы, простой задачей, но не смог найти простого решения. Я хотел задать этот вопрос самыми простыми словами, чтобы другие и я могли извлечь выгоду из подобных ситуаций. Я наткнулся на запрос, который нужно было немного реорганизовать, что принесло некоторые странные результаты.Объединить результаты SQL-запроса

Что бы лучший способ превратить эти результаты:

ID Customer CustomerID (US) CustomerID (CA) CustomerID (EU) 
----------------------------------------------------------------------- 
1  XYZ   XYZ - US   NULL    NULL 
2  XYZ   NULL    XYZ - CA   NULL 
3  XYZ   NULL    NULL    XYZ - EU 

В это:

ID Customer CustomerID (US) CustomerID (CA) CustomerID (EU) 
----------------------------------------------------------------------- 
1  XYZ   XYZ - US   XYZ - CA   XYZ - EU 

Если есть больше чем один подход, что было бы лучшим способом следующий самый ток лучшие практики?

Ниже приведен пример кода, который в настоящее время производит первые результаты:

SELECT Header.ID, 
     Header.Customer, 
     CASE Detail.Location 
      WHEN 'US' THEN Detail.CustomerID 
      ELSE NULL 
     END AS [CustomerID (US)], 
     CASE Detail.Location 
      WHEN 'CA' THEN Detail.CustomerID 
      ELSE NULL 
     END AS [CustomerID (CA)], 
     CASE Detail.Location 
      WHEN 'EU' THEN Detail.CustomerID 
      ELSE NULL 
     END AS [CustomerID (EU)] 
    FROM dbo.Header AS Header 
     LEFT OUTER JOIN dbo.Detail AS Detail 
      ON Header.ID = Detail.HeaderID 

Большое спасибо за вашу помощь!

+0

Cant вы просто группа по Header.Customer затем MAX() другие столбцы? – br4d

+0

выглядит как сводный вопрос: https://stackoverflow.com/questions/13372276/simple-way-to-transpose-columns-and-rows-in-sql – wero

ответ

2

Вы просто хотите агрегация:

SELECT MIN(Header.ID) as ID, Header.Customer, 
     MAX(CASE Detail.Location WHEN 'US' THEN Detail.CustomerID 
      END) AS [CustomerID (US)], 
     MAX(CASE Detail.Location WHEN 'CA' THEN Detail.CustomerID 
      END) AS [CustomerID (CA)], 
     MAX(CASE Detail.Location WHEN 'EU' THEN Detail.CustomerID 
      END) AS [CustomerID (EU)] 
FROM dbo.Header LEFT OUTER JOIN 
    dbo.Detail Detail 
    ON Header.ID = Detail.HeaderID 
GROUP BYHeader.Customer 
+0

+1 для примера. Однако это решение работает очень хорошо, но я еще не взглянул на планы выполнения, чтобы увидеть, насколько значительная часть производительности влияет на агрегаты. – Tama198

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