SQL表示没有具有特定值的行

时间:2014-12-21 03:35:41

标签: sql-server count

我是SQL的新手,我需要你的帮助。 我有一个包含Name列和Value列的表格。 此值代表3值枚举,我们说YesNoMaybe

我试图计算每个名字,我有多少次枚举的每个值。像这样:

Name1   Yes     3
Name1   No      1
Name1   Maybe   4

Name2   Yes     0
Name2   No      1
Name2   Maybe   2

Name3   Yes     1
Name3   No      0
Name3   Maybe   7

但有时候我没有任何具有给定值的给定名称的条目,并且它不会显示。很快,当计数为0时,我没有得到这一行。 我必须把它放在一个存储过程中。

我怎样才能做到这一点? 提前谢谢大家!

P.S。我使用的是SQL Server

编辑:

我尝试的是:

SELECT  Name,
        Value,
        COUNT(Value) as ValueCount
from Data
group by Name, Value
order by Name

4 个答案:

答案 0 :(得分:2)

使用cross join生成所有行。然后使用left join加入计数值:

SELECT n.Name, v.value, COUNT(d.value) as ValueCount
from (select distinct name from Data) n cross join
     (select distinct value from Data) v left join
     data d
     on d.name = n.name and d.value = v.value
group by n.Name, v.Value
order by n.Name;

您没有指定数据库。这是标准SQL,应该适用于任何数据库。

答案 1 :(得分:1)

您可以使用两个cte获取要显示的所有组合的列表,然后使用原始表格进行左连接。

WITH enum AS
(
  SELECT 'Yes' AS Value
  UNION
  SELECT 'No'
  UNION
  SELECT 'Maybe'
), combs AS
(
  SELECT DISTINCT d.Name, e.Value
  FROM enum e, Data d
)
SELECT c.Name, c.Value, COUNT(d.Name) FROM combs c
LEFT JOIN data d ON d.Name = c.Name AND d.Value = c.Value
GROUP BY c.Name, c.Value
ORDER BY c.Name, c.Value

答案 2 :(得分:0)

整体看着你的桌子,它会像这样清洁得多:

Name    Yes    No    Maybe
__________________________

Bob     3      4       0
Tim     0      1       3
Jim     2      7       2

我知道这不是解决问题的真正答案,但是这个表格要小得多,并且会得到相同的结果。

答案 3 :(得分:0)

通常在尝试计算不存在的东西时,最好加入到驱动程序表中,在这种情况下,您需要所有名称/值对加入,在下面简单地创建cte使用CROSS JOIN,但您可以通过多种方式提取值:

;with cte AS (SELECT DISTINCT d1.name,d2.value
              FROM data d1
              CROSS JOIN data d2
              )

SELECT  cte.Name,
        cte.Value,
        COALESCE(COUNT(d.Value),0) as ValueCount
from cte 
LEFT JOIN Data d
  ON d.value = cte.value
  AND d.name = cte.name
group by cte.Name, cte.Value
order by cte.Name

由于这需要LEFT JOIN任何缺失的值都会返回NULL,因此COALESCE()用于显示0