2013-09-24 10 views
1

Я пытаюсь взять три таблицы, которые у меня есть, и показать данные так, как пользователь попросил меня сделать это. Таблицы выглядят так. (Я должен добавить, что я использую MS SQL Server)SQL Server делает строки в столбцах

Первая таблица: Идентификатор - это varchar, так как это идентификатор, который они используют для идентификации активов, и они используют числа, а также буквы.

aID| status | group | 
    ----------------------- 
    1 | acti | group1 | 
    2 | inac | group2 | 
    A3 | acti | group1 | 

Вторая таблица: эта таблица исправлена. Она имеет около 20 значений и идентификаторы всех номера

atID| traitname | 
    ------------------ 
    1 | trait1 | 
    2 | trait2 | 
    3 | trait3 | 

Третьей Таблица: Эта таблица используется для определения черты активов в первой таблице есть. Поля, имеющие то же имя, что и поля в приведенных выше таблицах, явно связаны.

tID| aID | atID | trait | 
---------------------------------- 
1 | 1 | 1 | NAME | 
2 | 1 | 2 | INFO | 
3 | 2 | 3 | GOES | 
4 | 2 | 1 | HERE | 
5 | A3 | 2 | HAHA | 

Теперь пользователь хочет программу для вывода данных в следующем формате:

aID| status | group | trait1 | trait2 | trait 3 
------------------------------------------------- 
1 | acti | group1 | NAME | INFO | NULL 
2 | inac | group2 | HERE | NULL | GOES 
A3 | acti | group1 | NULL | HAHA | NULL 

Я понимаю, что для достижения этой цели, я должен использовать команду Pivot в SQL. Тем не менее, я читал и пытался понять это, но я просто не могу понять. Особенно в той части, где она запрашивает значение MAX. Я не понимаю, зачем мне это МАКС.

Кроме того, примеры, которые я видел, предназначены для одной таблицы. Я не уверен, могу ли я сделать это с тремя таблицами. У меня есть запрос, который объединяет всех трех из них с необходимой мне информацией. Однако я не знаю, как исходить оттуда. Пожалуйста, любая помощь с этим будет оценена. Спасибо.

ответ

4

Существует несколько способов получить результат, в том числе с использованием функции PIVOT.

Вы можете использовать агрегатную функцию с выражением CASE-:

select t1.aid, t1.status, t1.[group], 
    max(case when t2.traitname = 'trait1' then t3.trait end) trait1, 
    max(case when t2.traitname = 'trait2' then t3.trait end) trait2, 
    max(case when t2.traitname = 'trait3' then t3.trait end) trait3 
from table1 t1 
inner join table3 t3 
    on t1.aid = t3.aid 
inner join table2 t2 
    on t3.atid = t2.atid 
group by t1.aid, t1.status, t1.[group]; 

См SQL Fiddle with Demo

Функция PIVOT требует агрегатной функции, поэтому вам нужно будет использовать либо функцию MIN или MAX (поскольку у вас есть строковое значение).

Если у вас есть ограниченное количество traitnames, то вы могли бы жестко закодировать запрос:

select aid, status, [group], 
    trait1, trait2, trait3 
from 
(
    select t1.aid, 
    t1.status, 
    t1.[group], 
    t2.traitname, 
    t3.trait 
    from table1 t1 
    inner join table3 t3 
    on t1.aid = t3.aid 
    inner join table2 t2 
    on t3.atid = t2.atid 
) d 
pivot 
(
    max(trait) 
    for traitname in (trait1, trait2, trait3) 
) piv; 

SQL Fiddle with Demo См.

Если у Вас есть неизвестное число значений, то вы хотите посмотреть на использование динамического SQL, чтобы получить конечный результат:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(traitname) 
        from Table2 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT aid, status, [group],' + @cols + ' 
      from 
      (
       select t1.aid, 
       t1.status, 
       t1.[group], 
       t2.traitname, 
       t3.trait 
       from table1 t1 
       inner join table3 t3 
       on t1.aid = t3.aid 
       inner join table2 t2 
       on t3.atid = t2.atid 
      ) x 
      pivot 
      (
       max(trait) 
       for traitname in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

См SQL Fiddle with Demo

+0

маркирован как правильный ответ. Хотя характеристики в таблице 2 являются фиксированной суммой, в будущем может быть больше. Поэтому я использовал ваше второе решение, и оно отлично работало. Большое спасибо за ваше объяснение и за помощь! – plasmy

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