значение столбца в одной строке - PullRequest
0 голосов
/ 30 ноября 2011

Первичная таблица

Id name 

1 xxxxx
2 yyyyy
3 zzzzzz

Внешняя таблица

Id   phonetype        phoneno 

1    home             111111
1    work             222222
1    mob              333333
2    work             444444
2    mob              555555

Мне нужно отобразить

Name    workphone   homephone        mob

xxxxx   222222       111111        333333
yyyyy   444444        null         555555

Как написать запрос в SQL Server 2008

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Вот еще два метода, только для полноты:

  1. SELECT
      p.name,
      MAX(CASE t.phonetype WHEN 'work' THEN t.phoneno END) AS workphone,
      MAX(CASE t.phonetype WHEN 'home' THEN t.phoneno END) AS homephone,
      MAX(CASE t.phonetype WHEN 'mob' THEN t.phoneno END) AS mobilephone
    FROM people p
      INNER JOIN phones t ON p.Id = t.Id
    GROUP BY p.Id, p.Name
    
  2. SELECT
      p.name,
      w.phoneno AS workphone,
      h.phoneno AS homephone,
      m.phoneno AS mobilephone
    FROM people p
      LEFT JOIN phones w ON p.Id = w.Id AND w.phonetype = 'work'
      LEFT JOIN phones h ON p.Id = h.Id AND h.phonetype = 'home'
      LEFT JOIN phones m ON p.Id = m.Id AND m.phonetype = 'mob'
    
2 голосов
/ 30 ноября 2011

Попробуйте что-то вроде этого:

SELECT 
    pt.NAME,
    (SELECT PhoneNo FROM dbo.Secondary s WHERE s.ID = pt.ID AND s.PhoneType = 'home') 'Home',
    (SELECT PhoneNo FROM dbo.Secondary s WHERE s.ID = pt.ID AND s.PhoneType = 'work') 'Work',
    (SELECT PhoneNo FROM dbo.Secondary s WHERE s.ID = pt.ID AND s.PhoneType = 'mob') 'Mobile'
FROM dbo.PrimaryTable pt
1 голос
/ 30 ноября 2011

В дополнение к решению Marc_s вы также можете использовать PIVOT для достижения этой цели:

SELECT [Name], [home], [work], [mob]
FROM
(
    SELECT [Name], phonetype, phoneno
    FROM Customer c join ContactDetail cd on c.Id = cd.id
) t
PIVOT
(
    MIN(PhoneNo) FOR [phonetype] IN ([home], [work], [mob]) 
) AS pvt
ORDER BY pvt.[Name]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...