计算缺失值

时间:2018-05-22 05:09:59

标签: sql sql-server tsql count

我有一个名为测试的下表:

Id                                   | SomeId | Value
-----------------------------------------------------
019D9E52-41D1-45DF-81B6-C7CC484115A7 |   1    |   1
262640CA-65C2-4E30-8654-E187ACA1EEF4 |   1    |   1
53710AFC-4E19-4B1C-B68B-CDB713EC3D62 |   1    |   2
8FF7E77C-D04C-4961-82D9-87C2E5A1A096 |   1    |   2
-----------------------------------------------------
119D9E52-41D1-45DF-81B6-C7CC484115A7 |   2    |   1
762640CA-65C2-4E30-8654-E187ACA1EEF4 |   2    |   1
93710AFC-4E19-4B1C-B68B-CDB713EC3D62 |   2    |   2
4FF7E77C-D04C-4961-82D9-87C2E5A1A096 |   2    |   2

还有一个名为 TestView 的视图:

SomeId | Value | Description
----------------------------
  1    |   1   |    'One'
  1    |   2   |    'Two'
  1    |   3   |    'Three'
----------------------------
  2    |   1   |    'One'
  2    |   2   |    'Two'

这些只是伪代码示例。

我想计算测试表中的所有值(针对特定的 [SomeId] ),以及来自 TestView 的值(具有特定的 [SomeId] )不在测试表中我只想将0显示为计数。

如果我想计算值WHERE [Test].[SomeId] = 1,请输入预期结果:

Value    | Count
-----------------
 One     |   2
 Two     |   2
 Three   |   0

这是我目前的查询:

SELECT
    tv.[Description] AS [Value],
    COUNT(t.[Id]) - COUNT(tv.[Value]) AS [Count]
FROM [TestView] AS tv
LEFT JOIN [Test] AS t ON
    t.[SomeId] = tv.[SomeId]
AND t.[Value] = tv.[Value]
WHERE 
    t.[SomeId] = 1
GROUP BY
    tv.[Description]

但是这给了我糟糕的结果......无论如何,这里是SQL Fiddle

  

编辑:

这只是测试表的补充。什么是Test表还有一个外键ID,我们称之为 OtherId 。现在,当我使用答案中的查询时,我不会得到我想要的结果。这是修改过的查询:

SELECT
    t1.Description AS Value,
    COUNT(t2.Value) AS Count
FROM TestView t1
LEFT JOIN test t2
    ON t1.Value = t2.Value AND t1.SomeId = t2.SomeId
WHERE t1.SomeId = 1
  AND t2.[OtherId] = *something* -- this is the addition
GROUP BY t1.Value, t1.Description
ORDER BY t1.Value;

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT
    t1.Description AS Value,
    COUNT(t2.Value) AS Count
FROM TestView t1
LEFT JOIN test t2
    ON t1.Value = t2.Value AND t1.SomeId = t2.SomeId
WHERE t1.SomeId = 1
GROUP BY t1.Value, t1.Description
ORDER BY t1.Value;

enter image description here

Demo

答案 1 :(得分:1)

以下是您的解决方案

SELECT
    tv.[Description] AS [Value],
    COUNT(t.[Id]) AS [Count]
FROM  [TestView]  AS tv 
LEFT OUTER JOIN  [Test] AS t ON tv.SomeId = t.SomeId 
                   AND t.Value = tv.value
                   AND t.[SomeId] = 1 


GROUP BY
    tv.[Description]