Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 server 2005 &引用;“旋转”;SQL Server中的非聚合数据_Sql Server 2005_Pivot_Sql - Fatal编程技术网

Sql server 2005 &引用;“旋转”;SQL Server中的非聚合数据

Sql server 2005 &引用;“旋转”;SQL Server中的非聚合数据,sql-server-2005,pivot,sql,Sql Server 2005,Pivot,Sql,这将是我在这里发布的第一个问题,请原谅我在董事会礼仪上的任何意外失误 在我当前的项目中,我使用了一个大型的非规范化表,并将其分解为四个独立的规范化表。我的最终目标是,为了向后兼容,创建一个模仿非规范化表的视图 为了提供场景的简化快照,我尝试做的关键在于两个表: ASSOC_ROLE ASSOCIATE ---------- ---------- assoc_id (fk) assoc_id (pk) role_id (fk) last

这将是我在这里发布的第一个问题,请原谅我在董事会礼仪上的任何意外失误

在我当前的项目中,我使用了一个大型的非规范化表,并将其分解为四个独立的规范化表。我的最终目标是,为了向后兼容,创建一个模仿非规范化表的视图

为了提供场景的简化快照,我尝试做的关键在于两个表:

ASSOC_ROLE          ASSOCIATE
----------          ----------
assoc_id (fk)       assoc_id (pk)
role_id  (fk)       last_name
org_nbr  (fk)
因此,如果我发出以下查询

SELECT Assoc_Role.org_nbr, Assoc_Role.assoc_id, Associate.last_name, Assoc_Role.role_id
FROM Assoc_Role INNER JOIN
     Associate ON Assoc_Role.assoc_id = Associate.assoc_id
WHERE Assoc_Role.org_nbr = '1AA'
…我得到以下结果集

org_nbr     assoc_id     last_name     role_id
-------     --------     ---------     -------
1AA         1447         Cooper        1
1AA         1448         Collins       3
1AA         1448         Collins       4
1AA         1448         Collins       5
1AA         1449         Lynch         6
最终,我想要构建的视图将如下所示:

org_nbr   role1_ID   role1_name   role2_ID   role2_name   role3_ID   role3_name   role4_ID   role4_name   role5_ID   role5_name   role6_ID   role6_name
-------   --------   ----------   --------   ----------   --------   ----------   --------   ----------   --------   ----------   --------   ----------
1AA       1447       Cooper       NULL       NULL         1448       Collins      1448       Collins      1448       Collins      1449       Lynch
我最初的想法是尝试使用PIVOT命令,但我的理解是PIVOT需要某种聚合,这不适合我的场景。我还在SELECT子句中使用了CASE命令,但它并没有将我的结果集缩减为一条记录

希望有人能对我如何做到这一点有所启发。如果有人需要更多信息,请告诉我。谢谢


Scot

要获取基本的编号角色数据,我们可以从

SELECT
    org_nbr
    , r1.assoc_id   role1_ID
    , r1.last_name  role1_name
    , r2.assoc_id   role2_ID
    , r2.last_name  role2_name
    , r3.assoc_id   role3_ID
    , r3.last_name  role3_name
    , r4.assoc_id   role4_ID
    , r4.last_name  role4_name
    , r5.assoc_id   role5_ID
    , r5.last_name  role5_name
    , r6.assoc_id   role6_ID
    , r6.last_name  role6_name
FROM
    ASSOC_ROLE ar
    LEFT JOIN ASSOCIATE r1 ON ar.role_id = 1 AND ar.assoc_id = r1.assoc_id
    LEFT JOIN ASSOCIATE r2 ON ar.role_id = 2 AND ar.assoc_id = r2.assoc_id
    LEFT JOIN ASSOCIATE r3 ON ar.role_id = 3 AND ar.assoc_id = r3.assoc_id
    LEFT JOIN ASSOCIATE r4 ON ar.role_id = 4 AND ar.assoc_id = r4.assoc_id
    LEFT JOIN ASSOCIATE r5 ON ar.role_id = 5 AND ar.assoc_id = r5.assoc_id
    LEFT JOIN ASSOCIATE r6 ON ar.role_id = 6 AND ar.assoc_id = r6.assoc_id
但是对于每个
组织_nbr
,这将为每个
角色_id
提供一行单独的数据!这不是我们想要的-所以我们需要按组织分组。但是,我们需要对
分组,或者对
选择
列表中的每一列进行聚合!然后,诀窍是提出一个聚合函数,该函数将安抚SQL Server并提供我们想要的结果。在这种情况下,
MIN
将完成以下工作:

SELECT
    org_nbr
    , MIN(r1.assoc_id)   role1_ID
    , MIN(r1.last_name)  role1_name
    , MIN(r2.assoc_id)   role2_ID
    , MIN(r2.last_name)  role2_name
    , MIN(r3.assoc_id)   role3_ID
    , MIN(r3.last_name)  role3_name
    , MIN(r4.assoc_id)   role4_ID
    , MIN(r4.last_name)  role4_name
    , MIN(r5.assoc_id)   role5_ID
    , MIN(r5.last_name)  role5_name
    , MIN(r6.assoc_id)   role6_ID
    , MIN(r6.last_name)  role6_name
FROM
    ASSOC_ROLE ar
    LEFT JOIN ASSOCIATE r1 ON ar.role_id = 1 AND ar.assoc_id = r1.assoc_id
    LEFT JOIN ASSOCIATE r2 ON ar.role_id = 2 AND ar.assoc_id = r2.assoc_id
    LEFT JOIN ASSOCIATE r3 ON ar.role_id = 3 AND ar.assoc_id = r3.assoc_id
    LEFT JOIN ASSOCIATE r4 ON ar.role_id = 4 AND ar.assoc_id = r4.assoc_id
    LEFT JOIN ASSOCIATE r5 ON ar.role_id = 5 AND ar.assoc_id = r5.assoc_id
    LEFT JOIN ASSOCIATE r6 ON ar.role_id = 6 AND ar.assoc_id = r6.assoc_id
GROUP BY
    org_nbr
输出:

org_nbr    role1_ID    role1_name role2_ID    role2_name role3_ID    role3_name role4_ID    role4_name role5_ID    role5_name role6_ID    role6_name
---------- ----------- ---------- ----------- ---------- ----------- ---------- ----------- ---------- ----------- ---------- ----------- ----------
1AA        1447        Cooper     NULL        NULL       1448        Collins    1448        Collins    1448        Collins    1449        Lynch
Warning: Null value is eliminated by an aggregate or other SET operation.

当然,如果最大
role\u id
增加…

如果可以的话,我强烈建议在常规代码(c#,vb,随便什么)中进行这种类型的旋转

SQL server中的数据透视有很多缺点。首先,任何超过7或8项的内容都会大大增加查询所需的时间。其次,它要求您要么执行动态sql,要么提前知道所有可能的id。第三,它将难以维持

同样的问题也存在于阿卡什姆的回答中

我们已经尝试了很多不同的方法来在纯SQL设置中实现这一点。对于数据量非常有限的小型数据集,它可以正常工作。但是,您已经拥有的角色Id的数量超过了它


相反,只需抓取数据,用您最喜欢的语言创建所需的表即可。此时,要么将数据放入另一个sql表中,要么将其发送到需要的地方。

有趣的是。。。我对在这种高级级别生成SQL查询还很陌生,所以我从来没有想过将一个表连续地连接到它自己,但我可以清楚地看到它是如何工作的。我的下一个挑战是将它合并到一个更大的查询中,但这给了我一个很好的开始。非常感谢!但有一个问题是关于:“如果最大角色id增加,这当然会不足……”你的意思是说,如果我要添加更多角色id,我需要在查询中考虑它们,还是你的建议不止这些?@ScottieByNature如果最大
角色id
增加,你有两个选择。如果更改是“过去最多6个,但现在最多9个”,则需要以我希望明确的方式添加到查询中。但是,如果是“现在将有任意数量的可能角色”,那么应该寻求不同的方法-在这种情况下,@Chris Lively的考虑发挥了作用,您应该考虑在SQL之外进行操作,或者使用动态SQL,或者完全使用其他方法-您可以在这里询问:)明白。。。非常感谢!一个公平的建议。。。然而,我试图构建此向后兼容视图的系统是基于VisualFoxPro的。我想我只是假设在SQLServer和FoxPro中创建这种复杂性的视图会更容易。在我继续努力的过程中,我绝对会记住这一点。谢谢