2013-03-21 3 views
0

У меня есть родительская таблица SalType и в этой таблице Saltype_name - это имя столбца. Другая таблица StaffSal, которая имеет отношение внешнего ключа с SalType. В StaffSal вхожу значения для каждого SalType_nameНазначить значение столбца в таблице как столбец другой таблицы

Таблица структуры, как это

SalType --table1 
SS_id SalType_name 
1  Basic 
2  HRA 
3  DA 

StaffSal --table2 
SV_id SS_id SV_value U_id 
2  1  15000 11 
3  2  0.1  11 
4  3  0.75  11 
5  1  10000  12 
6  2  0.01  12 
7  3  0.5  12 

мне нужно показать, как этот

U_id Basic HRA DA ... 
11 15000 .1 .75 
12 10000 .01 .5 

Может кто-нибудь помочь?

ответ

2

Существует несколько способов преобразования данных из строк в столбцы.

SQL Server имеет функцию PIVOT, которая может применяться для поворота данных.

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

select u_id, Basic, HRA, DA 
from 
(
    select t.saltype_name, 
    s.u_id, 
    s.sv_value 
    from saltype t 
    left join staffsal s 
    on t.ss_id = s.ss_id 
) src 
pivot 
(
    max(sv_value) 
    for saltype_name in (Basic, HRA, DA) 
) piv; 

См SQL Fiddle with Demo.

Но если у вас есть неизвестное число значений, то вам нужно будет реализовать динамический SQL для создания результата:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(SalType_name) 
        from SalType 
        group by SS_id, SalType_name 
        order by SS_id 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT u_id, ' + @cols + ' 
       from 
      (
       select t.saltype_name, 
        s.u_id, 
        s.sv_value 
       from saltype t 
       left join staffsal s 
        on t.ss_id = s.ss_id 
      ) x 
      pivot 
      (
       max(sv_value) 
       for saltype_name in (' + @cols + ') 
      ) p ' 

execute(@query) 

См SQL Fiddle with Demo.

Оба запроса дают результат:

| U_ID | BASIC | HRA | DA | 
------------------------------ 
| 11 | 15000 | 0.1 | 0.75 | 
| 12 | 10000 | 0.01 | 0.5 | 
+0

Также я хочу показать SS_id в результате. Я попытался дать это в ur query.But, это показывает, что строки повторяются. Возможно, вы получите решение – Ajoe

+0

@Ajoe. Проблема в том, что 'SS_id' отличается, поэтому, когда в запросе применяется' GROUP BY', вы будет генерировать несколько строк. – Taryn

+0

ya, но каким-то образом мне нужен SS_id в этом наборе результатов. У вас есть предложения? – Ajoe

1

Сверление в сервере sql можно использовать для получения вышеуказанного результата.

SELECT * FROM 
      (SELECT 
       SV_value, 
       SalType_name, 
       U_id 
      FROM 
       StaffSal 
      INNER JOIN SalType 
        ON StaffSal.SS_id= SalType.SS_id) AS SalaryDetails 
PIVOT (SUM(SV_value) FOR SalType_name IN (HRA,Basic,DA)) AS PVT 
+0

Да теперь я получил правильный результат. Но имя SalType будет меняться. Можно ли дать подзапрос, чтобы получить имена в PIVOT (SUM (SV_value) FOR SalType_name IN (HRA, Basic, DA)) AS PVT – Ajoe

+1

В этом случае мы должны использовать динамический sql. – Novice

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