2015-03-19 161 views
-1

我找不到问题。我有很多桌子相互连接在一起。我需要从FormInstances表(应计数Id列)中获取表格实例的数量,但它会回调错误的数据。SQL。 COUNT()函数的错误结果

所以我的查询是这样的:

DECLARE @dateStart DATE  = NULL, 
@dateEnd  DATE   = NULL, 
@workshop  NVARCHAR(60) = '', 
@shiftNr  NVARCHAR(60) = '', 
@article  NVARCHAR(60) = '', 
@controllier NVARCHAR(60) = 'Name of Controlier' 

SELECT COUNT(FI.Id) AS [Count of Instances] 
FROM FormInstances AS FI 
LEFT JOIN FormFields  AS FF 
    ON FI.FormVersionId = FF.FormVersionid 
LEFT JOIN ..... 
WHERE 
FF.Id    = FV.FormFieldId  AND 
FI.Id    = ... 

输出NOW:

Count of Instances 
    414400 
    414400 
    414400 
    414400 
    384800 

输出应为:

Count of Instances 
     5 

如果我传递给选择条款:FI.IdIdFormInstances表)在以下几点:

SELECT COUNT(FI.Id) AS [Count of Instances], 
      FI.Id AS [Instance Ids] 
FROM.... 

我得到了正确的Instance Ids但情况相同,错误计数:

Count of Instances Instance Ids 
     414400    23 
     414400    24 
     414400    25 
     414400    26 
     384800    52 

那么,为什么它会在返回的实例计数不正确?

+0

你想在FormInstances中计算什么?如果您使用计数和主键,您将始终得到1. – Juan 2015-03-19 13:16:24

+0

我想根据此WHERE条款从FormInstances表中获取“Id”的数量。 – 2015-03-19 13:19:17

+0

也许是在其他表中作为外键的形式id的计数? 如果这是正确的,请使用此信息将计数移到另一个表。 – Juan 2015-03-19 13:23:29

回答

7

你正在做一个连接,它是乘以记录的数量。尝试计数范围内使用不同的删除重复:

COUNT(distinct FI.Id) 
+0

@StanislovasKalašnikovas你是否意外地通过FI.Id分组?上面应该这样做 – NickyvV 2015-03-19 13:21:06

+0

OMG真的我错过了这里是分组。谢谢。 – 2015-03-19 13:23:40

2

如果你只是想:

Count of Instances 
     5 

你应该改变:

SELECT COUNT(FI.Id) AS [Count of Instances], 
      FI.Id AS [Instance Ids] 
FROM.... 

要这样:

SELECT COUNT(*) AS [Count of Instances] 
FROM.... 

但我不明白你发布的查询可以返回你说你得到的结果,所以我认为你可能在这个问题上犯了一个错误。

+0

'SELECT COUNT(*)AS [实例计数]'返回与'SELECT COUNT(FI.Id)AS [实例计数]相同' – 2015-03-19 13:17:48

+0

请发布示例数据。我认为你的查询不可能返回你所说的结果。 – 2015-03-19 13:25:51