Нужна помощь для Cross Tab SQL Query - PullRequest
3 голосов
/ 21 июня 2011

Это пример таблицы источника:

    UserID  UserNameType    UserName
    1       First Name      FN1
    1       Last Name       LN1
    2       First Name      FN2
    2       Last Name       LN2
    3       First Name      FN3
    3       Last Name       LN3
    4       First Name      FN4
    4       Last Name       LN4

Я бы хотел, чтобы у меня был SQL-запрос для отображения моего результата в указанном формате.

   
    UserID  FirstName   LastName
    1       FN1         LN1
    2       FN2         LN2
    3       FN3         LN3
    4       FN4         LN4

Нужна дополнительная помощь по этому вопросу ...

Need Help

Спасибо, Yugal

Ответы [ 5 ]

3 голосов
/ 21 июня 2011

Простой метод перекрестных таблиц (который я лично предпочитаю) заключается в использовании оператора group by с шаблоном MAX (CASE WHEN ...) для управления полями перекрестных таблиц.Это легко понять IMO и легко расширить с помощью дополнительных полей.Я не уверен в производительности.

select
    UserID,
    max(case when usernametype='First Name' then username end) as FirstName,
    max(case when usernametype='Last Name' then username end) as LastName
from
    MyTable T
group by
    UserID
2 голосов
/ 21 июня 2011
SELECT
  [fn].UserID,
  [fn].UserName,
  [ln].UserName
FROM
  yourTable AS [fn]
INNER JOIN
  yourTable AS [ln]
    ON [fn].UserID = [ln].UserID
WHERE
      [fn].UserNameType = 'FirstName'
  AND [ln].UserNameType = 'LastName'
1 голос
/ 21 июня 2011

Предположим, у вас есть следующая таблица

create table #temp1
(
    UserID  int,
    usernametype varchar(10),
    username varchar(10)
)

Ниже приведены вставки

insert into #temp1(userid, usernametype, username) valueS(1, 'First Name', 'FN1')
insert into #temp1(userid, usernametype, username) valueS(1, 'Last Name', 'LN1')
insert into #temp1(userid, usernametype, username) valueS(2, 'First Name', 'FN2')
insert into #temp1(userid, usernametype, username) valueS(2, 'Last Name', 'LN2')
insert into #temp1(userid, usernametype, username) valueS(3, 'First Name', 'FN3')
insert into #temp1(userid, usernametype, username) valueS(3, 'Last Name', 'LN3')
insert into #temp1(userid, usernametype, username) valueS(4, 'First Name', 'FN4')
insert into #temp1(userid, usernametype, username) valueS(4, 'Last Name', 'LN4')

enter image description here

SQl Query

SELECT  userid, [First Name], [Last Name]
FROM    
( 
    SELECT userid, usernametype, username FROM #temp1
) 
p 
PIVOT 
( 
    Max(username) FOR usernametype 
    IN ([First Name], [Last Name])
) AS pvt

Окончательный набор результатов

enter image description here

1 голос
/ 21 июня 2011

Чтобы избежать подзапросов и штрафов за скорость, которые могут возникнуть из них, просто присоединяйтесь.

SELECT DISTINCT
 T1.UserID UserID, 
 T1.UserName FirstName, 
 T2.UserName LastName
FROM 
 Users T1 JOIN Users T2 
  ON T1.UserID = T2.userID
WHERE 
 T1.UserNameType = 'FirstName'
 AND T2.UserNameType = 'LastName'

РЕДАКТИРОВАТЬ: должно быть исправлено сейчас.

1 голос
/ 21 июня 2011

Вы можете использовать подзапрос

SELECT 
    UserID,
    UserName as FirstName,
    (SELECT top 1 UserName 
     FROM myTable 
     WHERE UserID = t.UserID 
     and UserNameType = 'Last Name') as LastName
FROM myTable t
WHERE t.UserNameType = 'First Name'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...