【问题标题】:Assign value of a column in a table as columname of another table将表中的列的值分配为另一个表的列名
【发布时间】:2013-03-21 09:41:10
【问题描述】:

我有一个父表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

谁能帮忙?

【问题讨论】:

    标签: sql asp.net-mvc sql-server-2008 pivot


    【解决方案1】:

    您可以通过多种方式将数据从行转换为列。

    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 |
    

    【讨论】:

    • 我也想在结果中显示 SS_id。我试图在你的查询中给出它。但它显示行正在重复。你能给我一个解决方案吗
    • @Ajoe 问题在于SS_id 是不同的,所以当GROUP BY 应用于查询时,您将生成多行。
    • 是的,但是我需要 SS_id 在那个结果集中。你有什么建议吗?
    • @Ajoe 请提出一个新问题,详细说明您要做什么。它将防止在 cmets 中来回。
    • 我需要操作 basic、hra 等的值。为此,我需要在 asp.net mvc3 中的该表的每个单元格中获取 SS_id
    【解决方案2】:

    可以使用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
    

    【讨论】:

    • 是的,现在我得到了正确的结果。但是 SalType_name 会有所不同。是否可以给出子查询来获取 PIVOT (SUM(SV_value) FOR SalType_name IN (HRA,Basic,DA)) AS PVT 中的名称
    • 在这种情况下我们必须使用动态sql。
    猜你喜欢
    • 2019-12-26
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多