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

任何人都可以帮忙吗?

4

2 回答 2

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 |
于 2013-03-21T10:18:24.283 回答
1

可以使用 sql server 中的 Pivot 来获得上述结果。

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
于 2013-03-21T10:09:48.400 回答