在执行其他连接时,Count(*)是否会扭曲所需的结果?

时间:2012-10-15 19:42:39

标签: sql sql-server sql-server-2008 tsql

我的查询工作正常;但是,我需要将另一个数据集加入到我的查询中,我希望count(f.*)会中断。

这是我开始的查询:

SELECT
       MIN(received_date) AS FirstVisit
     , patient_id         AS PatientID
INTO #LookupTable
FROM F_ACCESSION_DAILY

SELECT 
       f.doctor           AS Doctor
     , COUNT(f.*)         AS CountNewPatients
     , MONTH(firstvisit)  AS Month
     , YEAR(firstvisit)   AS Year
FROM F_ACCESSION_DAILY f 
INNER JOIN #LookupTable l ON f.received_date = l.FirstVisit 
                         AND f.patient_id = l.PatientID
GROUP BY f.doctor
       , MONTH(firstvisit)
       , YEAR(firstvisit)

DROP TABLE #LookupTable

我想在另一个表上加入上面的查询。

问题是 * 我的count(f.*)会保持不变还是会更改,因为我添加了新的数据集? *

* *如何确保count(f.*)保持不变?

非常感谢你的指导。

3 个答案:

答案 0 :(得分:4)

  

我的count(f.*)会保持不变,还是会改变,因为我添加了新的数据集?*

COUNT(*)计算行数。如果您加入另一个表并且行数增加,COUNT(*)的结果将会增加。

  

如何确保count(f.*)保持不变?

使用COUNT (DISTINCT f.Id)

答案 1 :(得分:1)

如果新表中每个patient_id只有一行(并且你正在进行内部联接),那么计数不会改变。否则,它会。

您可以使用OUTER APPLY(SELECT TOP 1 ....)代替JOIN来保证计数不会改变。

顺便说一句,看起来你在第一个SELECT中缺少GROUP BY patient_id。

答案 2 :(得分:1)

加入不会“倾斜”COUNT(*)。计数完全符合广告宣传的要求。问题是你可能正在增加行数,而没有真正实现它。

解决问题的一种方法是在适当的级别进行聚合。有时候,你必须这样做 - 例如,当涉及到SUMs和AVG时。

但是,对于计数,您可以将其替换为:

count(distinct AccessionDailyID)

即使行成倍增加,这也可以计算出来。顺便说一句,这假设你的表每行都有一个唯一的id。

顺便说一句,您可能希望确保使用LEFT OUTER JOIN而不是INNER JOIN来确保在加入过程中不会丢失任何行。