我们可以在一个查询中使用两个枢轴吗?

用户名
Declare @tbl table(SessionId varchar(max),ItemID_FK int,Roles varchar(max))
    insert into @tbl
    select distinct SessionID,ItemID_FK,Roles from tbl_Answers where ID_FK=@ID
    SELECT ItemID_PK,ItemName,case when [Role1] IS NULL then 0 else [Role1] end as [Role1],
    case when [Role2] IS NULL then 0 else [Role2] end as [Role2],
    case when [Role3] IS NULL then 0 else [Role3] end as [Role3],
    case when [Role4] IS NULL then 0 else [Role4] end as [Role4],
    case when [Role5] IS NULL then 0 else [Role5] end as [Role5],
    case when [Role6] IS NULL then 0 else [Role6] end as [Role6],
    case when [Role7] IS NULL then 0 else [Role7] end as [Role7]
    FROM 
    (
    select  items.ItemID_PK ,items.ItemName,count(ans.Roles) as cntRoles,ans.Roles from tbl_Items items Full  join  @tbl ans
    on items.ItemID_PK=ans.ItemID_FK where items.ID_FK= @ID group by Roles,ItemName , items.ItemID_PK
    ) d  PIVOT
     (
          max(cntRoles)
          FOR Roles IN ([Role1],[Role2],[Role3],[Role4],[Role5],[Role6],[Role7])
     ) AS pvt order by ItemID_PK

我使用了上面的存储过程,得到的输出为

+----------+----------+-----+-----+-----+-----+-----+-----+-----+
|ItemID_PK |ItemName  |Role1|Role2|Role3|Role4|Role5|Role6|Role7|
+----------+----------+-----+-----+-----+-----+-----+-----+-----+
|  111     | aaaaa    | 6   |  5  | 0   | 5   |   1 |  4  |  2  |
|  222     | bbbbb    | 1   |  1  | 7   | 2   |   0 |  3  |  1  |
+----------+----------+-----+-----+-----+-----+-----+-----+-----+

我有另一个查询,并得到以下输出。

Select Category,Answer,Roles
from tbl_Answers where ID_FK=1 and Category='OtherText'

+---------+--------+-----+
|Category |Answer  |Roles|
+---------+--------+-----+
|OtherText| xxx    |Role1|
|OtherText| yyy    |Role1|
|OtherText| zzz    |Role2|
|OtherText| xzx    |Role3|
+---------+--------+-----+

我需要合并以上两个输出以生成结果

+----------+----------+-----+-----+-----+-----+-----+-----+-----+
|ItemID_PK |ItemName  |Role1|Role2|Role3|Role4|Role5|Role6|Role7|
+----------+----------+-----+-----+-----+-----+-----+-----+-----+
|  111     | aaaaa    | 6   |  5  | 0   | 5   |   1 |  4  |  2  |
|  222     | bbbbb    | 1   |  1  | 7   | 2   |   0 |  3  |  1  |
|  Null    | Othertext| xxx | zzz | xzx | saa |     | xxx |     |
|  Null    | Othertext| yyy |     |     | zxz |     |     |     |
+----------+----------+-----+-----+-----+-----+-----+-----+-----+

如何将第二个查询与第一个枢轴查询组合以获得上述结果?

提前致谢。

加雷斯

您可以只使用UNION ALL合并两个结果,但是需要将顶部查询中的角色从int转换为VARCHAR:

DECLARE @ID INT = 1;

WITH Ans AS
(   SELECT  DISTINCT SessionID,ItemID_FK,Roles 
    FROM    tbl_Answers 
    WHERE   ID_FK = @ID
), PivotData AS
(   SELECT  items.ItemID_PK,
            items.ItemName,
            cntRoles = COUNT(ans.Roles),
            ans.Roles 
    FROM    tbl_Items items 
            FULL JOIN Ans
                ON items.ItemID_PK = ans.ItemID_FK 
    WHERE   items.ID_FK = @ID 
    GROUP BY Roles,ItemName, items.ItemID_PK

)
SELECT  ItemID_PK,
        ItemName,
        [Role1] = CAST(ISNULL([Role1], 0) AS VARCHAR(255)),
        [Role2] = CAST(ISNULL([Role2], 0) AS VARCHAR(255)),
        [Role3] = CAST(ISNULL([Role3], 0) AS VARCHAR(255)),
        [Role4] = CAST(ISNULL([Role4], 0) AS VARCHAR(255)),
        [Role5] = CAST(ISNULL([Role5], 0) AS VARCHAR(255)),
        [Role6] = CAST(ISNULL([Role6], 0) AS VARCHAR(255)),
        [Role7] = CAST(ISNULL([Role7], 0) AS VARCHAR(255))
FROM    PivotData
        PIVOT
        (   MAX(cntRoles)
            FOR Roles IN ([Role1],[Role2],[Role3],[Role4],[Role5],[Role6],[Role7])
        ) AS pvt 
UNION ALL
SELECT  ItemID_PK = NULL,
        ItemName = Category,
        [Role1] = ISNULL([Role1], ''),
        [Role2] = ISNULL([Role2], ''),
        [Role3] = ISNULL([Role3], ''),
        [Role4] = ISNULL([Role4], ''),
        [Role5] = ISNULL([Role5], ''),
        [Role6] = ISNULL([Role6], ''),
        [Role7] = ISNULL([Role7], '')
FROM    (   SELECT  Category,Answer,Roles
            FROM    tbl_Answers 
            WHERE   ID_FK = 1 
            AND     Category = 'OtherText'
        ) pd
        PIVOT
        (   MAX(Answer)
            FOR Roles IN ([Role1],[Role2],[Role3],[Role4],[Role5],[Role6],[Role7])
        ) AS pvt 
ORDER BY ItemID_PK;

注意,我更改了此表达式:

case when [Role2] IS NULL then 0 else [Role2] end

ISNULL([Role2], 0)

因为效果是一样的,但是要短得多。我还删除了表变量,并在公共表表达式中放置了相同的查询,因为填充表变量然后仅引用一次似乎是多余的。您将删除对实际表的索引和统计信息的使用,并不会因此获得任何好处。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以在两个不同的活动类中使用一个片段吗

来自分类Dev

我们可以在一个应用程序中使用两个MTProto连接吗?

来自分类Dev

我们可以在两个不同的活动类中使用一个片段吗

来自分类Dev

我们可以在Postgres的同一查询中使用两个求和函数吗

来自分类Dev

我们可以在两个不同的主机上使用一个SSL证书吗

来自分类Dev

我们可以在一个Android应用中使用两次INSTALL_REFERRER吗?

来自分类Dev

我们可以在一个 node.js 中使用 app.use 两次吗

来自分类Dev

我们可以一次对两个不同的数组使用foreach()吗?

来自分类Dev

我们可以为一个外键引用两个不同的表吗?

来自分类Dev

ReactJS:我们可以在一个文本字段中有两个onChange吗?

来自分类Dev

我们可以在一个外键字段中拥有两个主键吗?

来自分类Dev

这是一个关于python中列表的问题。我们可以连接两个列表吗

来自分类Dev

我们可以在Hibernate HQL查询中连接两个属性吗?

来自分类Dev

我们可以为两个协议http和https创建一个wcf服务吗

来自分类Dev

我可以在一个模型中使用两个警卫吗?

来自分类Dev

我们可以运行一个枢轴来在Linux中将1条记录转换为多条记录吗

来自分类Dev

我们可以将一个递归查询的输出用于另一个递归查询吗?

来自分类Dev

我们可以使用两个页面之间的IndexdDB对象存储吗

来自分类Dev

我们可以两次提交一个jsp表格吗?

来自分类Dev

我们可以在另一个SP中使用Sql Server Profiler获得存储过程调用吗

来自分类Dev

我们可以在邮件功能中使用post方法重定向到另一个页面吗

来自分类Dev

我们可以使用Ember.js建立一个静态网站吗?

来自分类Dev

我们可以使用数组的最后一个元素吗?

来自分类Dev

我们可以在一个复选框上触发两个事件吗?单击一个来自 javascript,另一个来自代码隐藏

来自分类Dev

我可以将这两个SQL查询合并为一个吗?

来自分类Dev

我可以在Rails中使用两个不同的名称创建一个属于another_model的模型吗?

来自分类Dev

我可以在gulp中使用一个任务重命名或复制两个文件吗?

来自分类Dev

我们可以从C中的同一结构中获得两个或多个typedef吗?

来自分类Dev

我们可以在同一服务器中安装两个报表服务实例吗?

Related 相关文章

  1. 1

    我们可以在两个不同的活动类中使用一个片段吗

  2. 2

    我们可以在一个应用程序中使用两个MTProto连接吗?

  3. 3

    我们可以在两个不同的活动类中使用一个片段吗

  4. 4

    我们可以在Postgres的同一查询中使用两个求和函数吗

  5. 5

    我们可以在两个不同的主机上使用一个SSL证书吗

  6. 6

    我们可以在一个Android应用中使用两次INSTALL_REFERRER吗?

  7. 7

    我们可以在一个 node.js 中使用 app.use 两次吗

  8. 8

    我们可以一次对两个不同的数组使用foreach()吗?

  9. 9

    我们可以为一个外键引用两个不同的表吗?

  10. 10

    ReactJS:我们可以在一个文本字段中有两个onChange吗?

  11. 11

    我们可以在一个外键字段中拥有两个主键吗?

  12. 12

    这是一个关于python中列表的问题。我们可以连接两个列表吗

  13. 13

    我们可以在Hibernate HQL查询中连接两个属性吗?

  14. 14

    我们可以为两个协议http和https创建一个wcf服务吗

  15. 15

    我可以在一个模型中使用两个警卫吗?

  16. 16

    我们可以运行一个枢轴来在Linux中将1条记录转换为多条记录吗

  17. 17

    我们可以将一个递归查询的输出用于另一个递归查询吗?

  18. 18

    我们可以使用两个页面之间的IndexdDB对象存储吗

  19. 19

    我们可以两次提交一个jsp表格吗?

  20. 20

    我们可以在另一个SP中使用Sql Server Profiler获得存储过程调用吗

  21. 21

    我们可以在邮件功能中使用post方法重定向到另一个页面吗

  22. 22

    我们可以使用Ember.js建立一个静态网站吗?

  23. 23

    我们可以使用数组的最后一个元素吗?

  24. 24

    我们可以在一个复选框上触发两个事件吗?单击一个来自 javascript,另一个来自代码隐藏

  25. 25

    我可以将这两个SQL查询合并为一个吗?

  26. 26

    我可以在Rails中使用两个不同的名称创建一个属于another_model的模型吗?

  27. 27

    我可以在gulp中使用一个任务重命名或复制两个文件吗?

  28. 28

    我们可以从C中的同一结构中获得两个或多个typedef吗?

  29. 29

    我们可以在同一服务器中安装两个报表服务实例吗?

热门标签

归档