使用UNION和第二个SELECT创建SQL视图

时间:2018-09-10 14:50:19

标签: sql

我有一个包含一些属性记录的表。属性之一是它们的状态。

我也有一个对状态进行计数和分组的视图。看起来像这样:

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应该是动态的。有什么办法可以代替它吗?

5 个答案:

答案 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);

Rextester Demo

答案 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];