Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何透视多个列并保持它们的关系_Sql_Sql Server_Sql Server 2008_Pivot - Fatal编程技术网

Sql 如何透视多个列并保持它们的关系

Sql 如何透视多个列并保持它们的关系,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,这件事我已经忙了三天了,希望有人能帮助我 我有一组数据需要做一些数据透视,但不能完全理解语法 样本数据集: Employee LastName FirstName Status Location GroupBU DeductionDesc Active Field Value ----------------------------------------------------------------------

这件事我已经忙了三天了,希望有人能帮助我

我有一组数据需要做一些数据透视,但不能完全理解语法

样本数据集:

Employee    LastName    FirstName   Status  Location    GroupBU     DeductionDesc   Active      Field                   Value
----------------------------------------------------------------------------------------------------------------------------------
12345       SMITH       JOHN            A       5555        9999    LIFE INS CHILD      Y       Deduction               8502
12345       SMITH       JOHN            A       5555        9999    LIFE INS CHILD      Y       EmployeeAmtPct          0.1
12345       SMITH       JOHN            A       5555        9999    LIFE INS CHILD      Y       EmployeeAnnSalary       10000
12345       SMITH       JOHN            A       5555        9999    LIFE INS CHILD      Y       EmployeeInsAmt          10000
67890       SMITH       JANE            A       5555        9999    LIFE INS SPOUSE     Y       Deduction               8501
67890       SMITH       JANE            A       5555        9999    LIFE INS SPOUSE     Y       EmployeeAmtPct          0.357
67890       SMITH       JANE            A       5555        9999    LIFE INS SPOUSE     Y       EmployeeAnnSalary       50000
67890       SMITH       JANE            A       5555        9999    LIFE INS SPOUSE     Y       EmployeeInsAmt          50000
预期结果:

Employee    LastName    FirstName   Status  Location    GroupBU [LIFE INS CHILD]    Deduction   EmployeeAmtPct  EmployeeAnnSalary   EmployeeInsAmt  [LIFE INS SPOUSE]   Deduction   EmployeeAmtPct  EmployeeAnnSalary   EmployeeInsAmt
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
12345       SMITH       JOHN        A       5555        9999    LIFE INS CHILD      8502        0.1             10000               10000           NULL                NULL        NULL            NULL                NULL
67890       SMITH       JANE        A       5555        9999    NULL                NULL        NULL            NULL                NULL            LIFE INS SPOUSE     8501        0.357           50000               50000
显然,在我的“期望的结果”中,我有重复的列名,这是行不通的,所以我假设我需要想出一种方法来为每个列名添加/预先添加一些内容,以使它们具有唯一性,但我还没有弄清楚如何做到这一点。这对于将不同的字段和值与最终输出中的相应“DecretionDesc”关联也是必要的。还要求“DecletOnDesc”中的值是最终输出中的列名,如果一个值不存在,则它只能为NULL(在输出中演示)

我的源数据是使用UNPIVOT创建的,因为这样做似乎更有可能成功

我在“DeclarationDesc”中有大约65个独特的值,以及大约3500个独特的员工记录

以下是我目前(大约第4次迭代)的代码:

select * 
from
    (
    select Employee,LastName,FirstName,Status,Location,GroupBU,DeductionDesc,Active,Field,Value 
    FROM MyTable
    ) unpvt
PIVOT 
    (
    MAX([DeductionDesc])
    FOR [DeductionDesc] IN ([LIFE INS SPOUSE],[LIFE INS CHILD UNUM POST TAX])
    ) pvt
PIVOT 
    (
    MAX([Value])
    FOR [Field] IN ([InsPlan],[EmployeeAnnSalary],[InsCoverage],[InsEmployeeRate],[EmployeeAmtPct],[InsLevelDesc],[InsCoverageDesc],[InsCarrierDesc],[InsPlanDesc],[InsLevel],[Deduction],[EmployeeInsAmt],[InsCarrier])
    ) pvt
为了可读性和简单性,我删除了“in”语句中第一个透视图中的大部分项目,但最初将所有65个项目都列在那里

如果有人能为我提供帮助,使我达到我想要的结果,我将不胜感激。如果需要更多信息,请告诉我。
谢谢

此处假设SQL Server语法,但该概念适用于大多数SQL风格。解决此问题的一种方法是使用CASE构造:

SELECT tA.Employee, tA.LastName, tA.FirstName, tA.Status, tA.Location,    
       tA.GroupBU, tB.Deduction, tB.EmployeeAmtPct

FROM your_table AS tA 

INNER JOIN

(SELECT Employee, SUM(CASE WHEN Field = 'Deduction'      THEN Value ELSE 0 END) AS Deduction,
                  SUM(CASE WHEN Field = 'EmployeeAmtPct' THEN Value ELSE 0 END) AS EmployeeAmtPct
                  ...and so on for all the fields that you want to transpose...
 FROM your_table 
 GROUP BY Employee) AS tB ON tA.Employee = tB.Employee

为了简洁起见,我只是把演绎法和EmployeeAmtPct放在这里。基本上,这是一个交叉列表查询。它只是根据“字段”所属的类别进行选择性求和。CASE语句中的ELSE子句确保始终有一个要求和的值。

假设此处使用SQL Server语法,但该概念适用于大多数SQL风格。解决此问题的一种方法是使用CASE构造:

SELECT tA.Employee, tA.LastName, tA.FirstName, tA.Status, tA.Location,    
       tA.GroupBU, tB.Deduction, tB.EmployeeAmtPct

FROM your_table AS tA 

INNER JOIN

(SELECT Employee, SUM(CASE WHEN Field = 'Deduction'      THEN Value ELSE 0 END) AS Deduction,
                  SUM(CASE WHEN Field = 'EmployeeAmtPct' THEN Value ELSE 0 END) AS EmployeeAmtPct
                  ...and so on for all the fields that you want to transpose...
 FROM your_table 
 GROUP BY Employee) AS tB ON tA.Employee = tB.Employee

为了简洁起见,我只是把演绎法和EmployeeAmtPct放在这里。基本上,这是一个交叉列表查询。它只是根据“字段”所属的类别进行选择性求和。CASE语句中的ELSE子句确保始终有一个要求和的值。

如果您不介意使用动态(将#myTable更改为您的表名)

返回


如果您不介意使用动态(将#myTable更改为您的表名)

返回


您使用的是什么风格的SQL?我看不到您的desire输出中有任何轴心。你能解释一下逻辑吗?@Pat这是在sql2008中R2@JuanCarlos我正在尝试旋转“DescriptionDesc”列,并将关联的其他列保留在其旁边。e、 g.扣除额,以及各种“比率”或“金额”列,仍然位于与其关联的同一描述SC的旁边。希望这是有意义的(这也是我第一次尝试PIVOT,并且已经浏览了许多其他帖子寻找类似的东西)用例语句it’s Work您使用的是什么风格的SQL?我在您的desire输出中没有看到PIVOT。你能解释一下逻辑吗?@Pat这是在sql2008中R2@JuanCarlos我正在尝试旋转“DescriptionDesc”列,并将关联的其他列保留在其旁边。e、 g.扣除额,以及各种“比率”或“金额”列,仍然位于与其关联的同一描述SC的旁边。希望这是有意义的(这也是我第一次尝试PIVOT,并且已经浏览了许多其他的帖子寻找类似的东西)用例声明它的工作谢谢。我现在正在测试,怀疑需要病例/加入。遇到一些转换问题,所以我将对此进行故障排除,并在完成后进行更新。谢谢。我现在正在测试,怀疑需要病例/加入。遇到一些转换问题,所以我将对此进行故障排除,并在完成后进行更新。