使用 GROUP BY ALL 重写查询

错误信息

Microsoft 已弃用GROUP BY ALL,虽然该查询现在可能有效,但我想将此查询用于未来的 SQL 升级。

目前,我的查询是:

SELECT       qt.QueueName AS [Queue] ,
             COUNT ( qt.QueueName ) AS [#ofUnprocessedEnvelopes] ,
             COUNT (   CASE WHEN dq.AssignedToUserID = 0 THEN 1
                            ELSE NULL
                       END
                   ) AS [#ofUnassignedEnvelopes] ,
             MIN ( dq.DocumentDate ) AS [OldestEnvelope]
FROM         dbo.VehicleReg_Documents_QueueTypes AS [qt]
             LEFT OUTER JOIN dbo.VehicleReg_Documents_Queue AS [dq] ON dq.QueueID = qt.QueueTypeID
WHERE        dq.IsProcessed = 0
             AND dq.PageNumber = 1
GROUP BY ALL qt.QueueName
ORDER BY     qt.QueueName ASC;

结果数据集:

<table><tbody><tr><td>Queue</td><td>#ofUnprocessedEnvelopes</td><td>#ofUnassignedEnvelopes</td><td>OldestEnvelope</td></tr><tr><td>Cancellations</td><td>0</td><td>0</td><td>NULL</td></tr><tr><td>Dealer</td><td>26</td><td>17</td><td>2018-04-06</td></tr><tr><td>Matched to Registration</td><td>93</td><td>82</td><td>2018-04-04</td></tr><tr><td>New Registration</td><td>166</td><td>140</td><td>2018-03-21</td></tr><tr><td>Remaining Documents</td><td>2</td><td>2</td><td>2018-04-04</td></tr><tr><td>Renewals</td><td>217</td><td>0</td><td>2018-04-03</td></tr><tr><td>Transfers</td><td>296</td><td>245</td><td>2018-03-30</td></tr><tr><td>Writebacks</td><td>53</td><td>46</td><td>2018-04-09</td></tr></tbody></table>

我已经尝试使用 CTE 和 UNION 的各种版本,但我无法正确生成结果集 - 没有计数的记录将不会显示,或者我将显示重复的记录。

关于如何在没有 GROUP BY ALL 的情况下完成这项工作的任何建议?

以下是我尝试使用 UNION 进行 CTE 的一次尝试:

;WITH QueueTypes ( QueueTypeID, QueueName )
AS ( SELECT QueueTypeID ,
            QueueName
     FROM   dbo.VehicleReg_Documents_QueueTypes )
SELECT   qt.QueueName AS [Queue] ,
         COUNT ( qt.QueueName ) AS [#ofUnprocessedEnvelopes] ,
         COUNT (   CASE WHEN dq.AssignedToUserID = 0 THEN 1
                        ELSE NULL
                   END
               ) AS [#ofUnassignedEnvelopes] ,
         CONVERT ( VARCHAR (8), MIN ( dq.DocumentDate ), 1 ) AS [OldestEnvelope]
FROM     QueueTypes AS qt
         LEFT OUTER JOIN dbo.VehicleReg_Documents_Queue AS dq ON dq.QueueID = qt.QueueTypeID
WHERE    dq.IsProcessed = 0
         AND dq.PageNumber = 1
GROUP BY qt.QueueName
UNION ALL
SELECT   qt.QueueName AS [Queue] ,
         COUNT ( qt.QueueName ) AS [#ofUnprocessedEnvelopes] ,
         COUNT (   CASE WHEN dq.AssignedToUserID = 0 THEN 1
                        ELSE NULL
                   END
               ) AS [#ofUnassignedEnvelopes] ,
         CONVERT ( VARCHAR (8), MIN ( dq.DocumentDate ), 1 ) AS [OldestEnvelope]
FROM     QueueTypes AS qt
         LEFT OUTER JOIN dbo.VehicleReg_Documents_Queue AS dq ON dq.QueueID = qt.QueueTypeID
GROUP BY qt.QueueName

但结果并不接近正确:

结果集

托尔斯滕·凯特纳

您当前的查询似乎不起作用,因为当您使用外连接表时,VehicleReg_Documents_Queue您会忽略WHERE子句中的所有外连接行,因此您将处于仅使用内连接的位置。您可能需要考虑将您的标准移至ON子句或立即将其设为内部联接。

同样奇怪的是,您加入队列类型和队列不是在队列 ID队列类型 ID 上,而是在dq.QueueID = qt.QueueTypeID. 这就像在与门牌号匹配的员工号上加入员工和地址。至少它看起来是这样。

(那为什么你的队列类型表有一个队列名称?队列表不应该包含队列名称吗?但这不是关于你的查询,而是关于你的数据模型。)

GROUP BY ALL意思是:“请给我们所有的 QueueNames,即使该WHERE条款驳回了它们。我认为您的查询有两种可能性:

  1. 你确实想要一个外连接。然后没有WHERE子句,你可以简单地做这个GROUP BY qt.QueueName
  2. 你不想要外连接。然后我们希望表中每个 QueueName 都有一行,我们可能无法通过简单地更改GROUP BY ALL qt.QueueNameGROUP BY qt.QueueName.

在第二种情况下,我们希望所有 QueueNames 首先和外部加入您的查询:

select 
  qn.QueueName AS [Queue],
  q.[#ofUnassignedEnvelopes],
  q.[OldestEnvelope]
FROM (select distinct QueueName from VehicleReg_Documents_QueueTypes) qn
LEFT JOIN
(
  SELECT       qt.QueueName,
               COUNT ( qt.QueueName ) AS [#ofUnprocessedEnvelopes] ,
               COUNT (   CASE WHEN dq.AssignedToUserID = 0 THEN 1
                              ELSE NULL
                         END
                     ) AS [#ofUnassignedEnvelopes] ,
               MIN ( dq.DocumentDate ) AS [OldestEnvelope]
  FROM         dbo.VehicleReg_Documents_QueueTypes AS [qt]
  JOIN         dbo.VehicleReg_Documents_Queue AS [dq] ON dq.QueueID = qt.QueueTypeID
  WHERE        dq.IsProcessed = 0
               AND dq.PageNumber = 1
) q ON q.QueueName = qn.QueueName
GROUP BY ALL qn.QueueName
ORDER BY     qn.QueueName ASC;

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以重写NOT IN查询以使用索引?

来自分类Dev

使用GROUP BY ALL的缺点?

来自分类Dev

sql查询使用group by怎么办

来自分类Dev

需要重写此查询,而无需使用相关子查询

来自分类Dev

用“ ALL”代替“ Group By”和“ Having”查询

来自分类Dev

使用GROUP BY和COUNT优化/重写LINQ查询

来自分类Dev

使用查询字符串重写URL

来自分类Dev

使用UNION / UNION ALL和Group By的MySQL查询错误

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

在SQL中的子查询中使用group by

来自分类Dev

如何使用MySQL子查询和GROUP BY

来自分类Dev

重写查询以使用分析功能

来自分类Dev

使用group-by的Mongodb聚合查询

来自分类Dev

使用linq group by语句作为子查询

来自分类Dev

使用GROUP BY的子查询中的MySQL COUNT

来自分类Dev

sql查询使用group by怎么办

来自分类Dev

使用GROUP BY和IN的SQL查询太慢

来自分类Dev

使用Group By和Let的LINQ查询

来自分类Dev

使用Django db Api重写SQL查询

来自分类Dev

需要重写此查询,而无需使用相关子查询

来自分类Dev

使用group by的oracle sql查询

来自分类Dev

在JPA查询中使用GROUP BY / HAVING子句

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

在SQL中的子查询中使用group by

来自分类Dev

SQL 查询 group by 和 have all

来自分类Dev

在 UNION ALL 上使用 GROUP BY 时未对结果进行分组

来自分类Dev

使用包含 GROUP BY 子句的表连接重写查询

来自分类Dev

使用 NOT EXISTS 重写查询的指南

来自分类Dev

使用 URL 参数重写查询