当前位置: 首页 > 面试题库 >

我想将ROLLUP与PIVOT结合使用-这是一个选择吗?

曹凯泽
2023-03-14
问题内容

我一直在用

SELECT
    Author,
    ISNULL(MAX(CASE Status WHEN 'Duplicate' THEN NumDocs END),'') AS Duplicate,
    ISNULL(MAX(CASE Status WHEN 'Failure' THEN NumDocs END),'') AS Failure,
    ISNULL(MAX(CASE Status WHEN 'Rejected' THEN NumDocs END),'') AS Rejected,
    ISNULL(MAX(CASE Status WHEN 'Success' THEN NumDocs END),'') AS Success,
    ISNULL(MAX(CASE Status WHEN 'TOTAL' THEN NumDocs END),'') AS TOTAL
FROM    
    (SELECT
        CASE WHEN (GROUPING(Author)=1) THEN 'ALL'
            ELSE ISNULL(Author,'UNKNOWN') END AS Author,
        CASE WHEN (GROUPING(Status )=1) THEN 'TOTAL'
            ELSE ISNULL(Status ,'UNKNOWN') END AS [Status],
        COUNT(Status) AS NumDocs
    FROM 
        tbl_Document D
    LEFT JOIN
        tbl_Status S
            ON
                D.status_id = S.status_id   
    GROUP BY
        Author,
        Status
    WITH ROLLUP) BASE
GROUP BY 
    Author

转换:

[Author]  [Status]
Alan      SUCCESS
Bob       FAILURE
Bob       SUCCESS
Charles   SUCCESS
Dave      FAILURE
Dave      DUPLICATE

到:

[Author] [SUCCESS] [FAILURE] [DUPLICATE] [TOTALS]
Alan        1         0           0         1
Bob         1         1           0         2
Charles     1         0           0         1
Dave        0         1           1         2
TOTAL       3         2           1         6

我可以使用PIVOT语句接近此输出,但是我不确定如何获取TOTAL行/列?

SELECT
  * 
FROM 
  (SELECT Author, status_id FROM tbl_Document) d
PIVOT
  (COUNT(status_id) FOR status_id IN ([1],[3],[5],[6])) p

给出:

[Author] [SUCCESS] [FAILURE] [DUPLICATE] 
Alan        1         0           0      
Bob         1         1           0      
Charles     1         0           0      
Dave        0         1           1

我猜我需要将ROLLUP放入某个子查询中的某个地方…?


问题答案:

您没有发布表架构,所以我尝试推断它。我从您提供的输入开始(请参阅最里面的注释SELECT),因此您应该能够将其调整为实际的模式。我增加了一位没有任何文档的作者,因为我认为您希望在最终报告的输出中看到那些作者。排除那些作者是微不足道的。

DECLARE @Status table
(
    Id int NOT NULL,
    Status nvarchar(50) NOT NULL
)

DECLARE @Authors table
(
    Id int NOT NULL,
    Name nvarchar(50) NOT NULL
)

DECLARE @Documents table
(
    Id int NOT NULL,
    AuthorId int NOT NULL,
    StatusId int NOT NULL
)

INSERT INTO @Status VALUES (1, 'Duplicate')
INSERT INTO @Status VALUES (2, 'Failure')
INSERT INTO @Status VALUES (3, 'Rejected')
INSERT INTO @Status VALUES (4, 'Success')

INSERT INTO @Authors VALUES (1, 'Alan')
INSERT INTO @Authors VALUES (2, 'Bob')
INSERT INTO @Authors VALUES (3, 'Charles')
INSERT INTO @Authors VALUES (4, 'Dave')
INSERT INTO @Authors VALUES (5, 'Tom') -- Test for authors without documents

INSERT INTO @Documents VALUES (1, 1, 4)
INSERT INTO @Documents VALUES (2, 2, 2)
INSERT INTO @Documents VALUES (3, 2, 4)
INSERT INTO @Documents VALUES (4, 3, 4)
INSERT INTO @Documents VALUES (5, 4, 2)
INSERT INTO @Documents VALUES (6, 4, 1)

SELECT
    (CASE WHEN GROUPING(Name) = 1 THEN 'Total' ELSE Name END) AS Author,
    SUM(Duplicate) AS Duplicate,
    SUM(Failure) AS Failure,
    SUM(Rejected) AS Rejected,
    SUM(Success) AS Success,
    SUM(Duplicate + Failure + Rejected + Success) AS Total
    FROM
    (
        SELECT
            Name,
            (CASE WHEN Status = 'Duplicate' THEN 1 ELSE 0 END) AS Duplicate,
            (CASE WHEN Status = 'Failure' THEN 1 ELSE 0 END) AS Failure,
            (CASE WHEN Status = 'Rejected' THEN 1 ELSE 0 END) AS Rejected,
            (CASE WHEN Status = 'Success' THEN 1 ELSE 0 END) AS Success
            FROM
            (
                -- Original input
                SELECT
                    a.Name,
                    s.Status
                    FROM @Authors a
                    LEFT OUTER JOIN @Documents d ON d.AuthorId = a.Id
                    LEFT OUTER JOIN @Status s ON d.StatusId = s.Id
            ) i
    ) j
    GROUP BY Name WITH ROLLUP

输出:

Author   Duplicate  Failure  Rejected  Success  Total
Alan     0          0        0         1        1
Bob      0          1        0         1        2
Charles  0          0        0         1        1
Dave     1          1        0         0        2
Tom      0          0        0         0        0
Total    1          2        0         3        6


 类似资料:
  • 本文向大家介绍如何选择是使用webpack还是rollup?相关面试题,主要包含被问及如何选择是使用webpack还是rollup?时的应答技巧和注意事项,需要的朋友参考一下 如何选择是使用webpack还是rollup? #2073 #2082

  • 问题内容: 有没有办法选择 匹配(或不匹配)任意选择器的 第n个孩子?例如,我要选择每个奇数表行,但要在行的子集内: 但是,无论它们是否属于“ row”类,似乎似乎都在计算所有元素,因此我最终得到了一个 偶数 “ row”元素,而不是我要寻找的两个元素。发生同样的事情。 有人可以解释为什么吗? 问题答案: 由于对工作方式和工作的误解,这是一个非常普遍的问题。不幸的是,目前还没有基于选择的解决方案至

  • 我有两个针对同一个表的select查询,这两个查询在select部分中都只包含一个< code>sum(),但是在< code>where子句中有所不同。我需要做的是对两个查询的结果求和。 查询示例: 我需要的是像这样的东西 其中选择和,如我的示例查询中所示。 我试着回答这个问题,但没能成功。我还尝试用替换字段,但这不起作用,因为不允许在中使用

  • 问题内容: 给定此选择器: 它将匹配一个正文,该正文的类包含 page-node-add- 的子字符串,而类恰好是 page-node-edit 我想说匹配第一个或第二个(但不能同时匹配)。可能吗? 使用逗号的问题: 如果我有一个长选择器,例如: 我原本以为CSS3可以解决这个问题,但是我想到的是: 谢谢 问题答案: 您需要使用逗号将它们分开: 使用逗号的问题: …是除了逗号以外,您无法做其他任何

  • 所以我有一个包含两个片段、一个存储库和一个ViewModel类的活动,因为我遵循Android开发人员的指南来使用MVVM结构。到目前为止,它似乎是有效的,但我不确定在实现方面是否遵循了良好的实践。到目前为止,它看起来是这样的: 存储库类: ViewModel类: 显示图书列表的回收器视图: 片段1 问题: 1) 我用对了吗?我应该在onActivityCreated()或其他地方使用viewMo

  • 问题内容: 在我的一个类中,一种方法执行AJAX请求。在请求的回调函数中,我需要使用调用对象的另一个方法。但是在这种情况下并没有引用我的对象,所以我不知道该怎么做。 为了澄清,请考虑以下代码: 问题答案: 您可以定义一个变量存储在闭包中: 或使用$ .proxy: 或者,如果您不做任何事情,只需要调用回调: 在现代浏览器中,您也可以使用bind。当我不必与IE8兼容时,我可以