2

我的查询工作正常;但是,我需要将另一个数据集加入到我的查询中,并且我希望它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.*)遗嘱保持不变?

非常感谢您的指导。

4

3 回答 3

4

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

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

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

使用COUNT (DISTINCT f.Id).

于 2012-10-15T19:48:28.957 回答
1

如果新表中每个 Patient_id 正好有 1 行(并且您正在执行 INNER JOIN),那么计数不会改变。否则,它会。

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

顺便说一句,您的第一个 SELECT 中似乎缺少 GROUP BY Patient_id。

于 2012-10-15T19:48:23.683 回答
1

联接不会“倾斜” COUNT(*). 计数完全按照它的广告宣传。问题是您可能会增加行数,而没有真正意识到这一点。

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

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

count(distinct AccessionDailyID)

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

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

于 2012-10-15T19:49:07.570 回答