在SQL Server中分组给出错误的计数

时间:2012-01-14 07:53:02

标签: sql

我有一个有效的查询,就像这样:

Select 
   count(InsuranceOrderLine.AntallPotensiale) as potensiale,
   COUNT(InsuranceOrderLine.AntallSolgt) as Solgt, 
   InsuranceProduct.Name,     
   InsuranceProductCategory.Name as Kategori
From 
   InsuranceOrderLine, InsuranceProduct, InsuranceProductCategory
where 
   InsuranceOrderLine.FKInsuranceProductId = InsuranceProduct.InsuranceProductID 
   and InsuranceProduct.FKInsuranceProductCategory = InsuranceProductCategory.InsuranceProductCategoryID
Group by 
   InsuranceProduct.name, InsuranceProductCategory.Name

此查询返回我需要的内容,但当我尝试添加更多表(InsuranceOrder)以便能够获取regardingUser列时,则所有计数值都很高。

Select 
    count(InsuranceOrderLine.AntallPotensiale) as Potensiale,
    COUNT(InsuranceOrderLine.AntallSolgt) as Solgt, 
    InsuranceProduct.Name, 
    InsuranceProductCategory.Name as Kategori, 
    RegardingUser
From 
    InsuranceOrderLine, InsuranceProduct, InsuranceProductCategory, InsuranceSalesLead
where 
    InsuranceOrderLine.FKInsuranceProductId = InsuranceProduct.InsuranceProductID 
    and InsuranceProduct.FKInsuranceProductCategory = InsuranceProductCategory.InsuranceProductCategoryID       
Group by 
    InsuranceProduct.name, InsuranceProductCategory.Name,RegardingUser

提前致谢

2 个答案:

答案 0 :(得分:4)

您在FROM语句中添加了一个表格,但没有为该表格指定任何JOIN条件 - 因此您之前的结果集将执行FULL OUTER JOIN(笛卡尔产品)与您的新表!当然,你会得到重复的数据......

这是我建议永远不要使用旧的旧式JOIN的原因之一 - 不要只是在FROM语句中列出以逗号分隔的一组表。

始终使用INNER JOINLEFT OUTER JOIN等新的 ANSI标准JOIN 语法:

SELECT
    count(iol.AntallPotensiale) as Potensiale,
    COUNT(iol.AntallSolgt) as Solgt, 
    ip.Name, 
    ipc.Name as Kategori, 
    isl.RegardingUser
FROM
    dbo.InsuranceOrderLine iol
INNER JOIN
    dbo.InsuranceProduct ip ON iol.FKInsuranceProductId = ip.InsuranceProductID 
INNER JOIN
    dbo.InsuranceProductCategory ipc ON ip.FKInsuranceProductCategory = ipc.InsuranceProductCategoryID       

INNER JOIN 
    dbo.InsuranceSalesLead isl ON ???????? -- JOIN condition missing here !!

执行此操作时,您首先会立即看到此处缺少JOIN条件 - 此新表InsuranceSalesLead如何链接到此处已使用的任何其他表SQL语句??

其次,你的意图更加清晰,因为链接表格的JOIN条件是它们所属的地方 - 与JOIN一致 - 并且不会混淆你的WHERE条款...

答案 1 :(得分:0)

看起来你添加了表连接,它略微增加了行数 - 确保你正确地加入了表。并且要注意几个连接表上的聚合函数 - 连接通常会导致重复