我有一个包含一些属性记录的表。属性之一是它们的状态。
我也有一个对状态进行计数和分组的视图。看起来像这样:
State Total
Canceled 9
Failed 3
Pending 10
Succeeded 7
由于我的参考表中没有处于“处理中”状态的记录,因此该视图不会在视图中显示该记录。但是,我希望视图中有五个可能的状态,即使表中不存在它。
我进行了以下查询,并接近使其工作(使用可用状态之一对其进行测试):
SELECT State, COUNT(State) AS Total
FROM dbo.Job
GROUP BY State
UNION
SELECT 'Processing' AS State, 0 AS Total
问题是我的“ 0 AS总计”。 0应该是动态的。有什么办法可以代替它吗?
答案 0 :(得分:1)
您可以使用LEFT JOIN
字典包含所有可能状态的表:
SELECT s.State, COUNT(j.State) AS Total
FROM StateTable s
LEFT JOIN dbo.Job j
ON s.state = j.state
GROUP BY s.State
答案 1 :(得分:0)
要么创建一个包含所有状态的表,要么将其加入其中,或者对脚本中的状态列表进行硬编码(但这可能是一种不好的方法)。
答案 2 :(得分:0)
您可以在原始查询周围添加额外的分组:
SELECT State, SUM(Total)
FROM (
SELECT State, COUNT(State) AS Total
FROM dbo.Job
GROUP BY State
UNION
SELECT 'Processing' AS State, 0 AS Total)
GROUP BY State
如果dbo.Job表中有任何“正在处理”条目,则将从“联合”中将它们添加到0。
另一个选项是Matt D建议的:创建一个引用表,其中包含所有可能的状态,然后向左连接dbo.Job表。
SELECT s.State, COUNT(j.State) AS Total
FROM dbo.All_States s
LEFT OUTER JOIN dbo.Job j
ON s.State = j.State
GROUP BY s.State
答案 3 :(得分:0)
您可以使用rollup
:
SELECT coalesce(state,'Processing') as State, sum(Total) as Total
FROM dbo.Job
GROUP BY rollup(State);
答案 4 :(得分:0)
为了获得State
的完整列表,所有值都必须来自起始数据集以外的其他位置(假设并非所有值都被表示,如“处理”的当前情况一样) )。那可以是一个表,如果您有权限创建这样的表,那么它是最好的选择;或者,如果需要,可以从列表中选择,如果添加了新的State
值,则必须维护该列表。
在第二种情况下,表值构造函数将为您完成这项工作。从该构造函数开始,然后LEFT JOIN
到您的数据源。 INNER JOIN
将再次过滤掉基础数据中缺少的值。
SELECT
s.[State]
,COUNT(j.[State]) AS Total
FROM
(
VALUES
('Canceled')
,('Failed')
,('Pending')
,('Succeeded')
,('Processing')
) AS s ([State])
LEFT JOIN
dbo.Job AS j
ON
s.[State] = j.[State]
GROUP BY
s.[State];