我的查询工作正常;但是,我需要将另一个数据集加入到我的查询中,我希望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.*)
保持不变?
非常感谢你的指导。
答案 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
来确保在加入过程中不会丢失任何行。