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を実行している場合)、カウントは変更されません。そうでなければ、そうなります。

JOINの代わりにOUTERAPPLY(SELECT TOP 1 ....)を使用して、カウントが変更されないようにすることができます。

ちなみに、最初のSELECTでGROUPBYpatient_idが欠落しているようです。

于 2012-10-15T19:48:23.683 に答える
1

結合は、を「歪曲」しませんCOUNT(*)。カウントは、宣伝されていることを正確に実行します。問題は、実際には気付かずに行数を増やしている可能性があることです。

この問題を解決する1つの方法は、適切なレベルで集計を行うことです。場合によっては、この方法で行う必要があります。たとえば、SUMとAVGが関係している場合です。

ただし、カウントについては、次のように置き換えることができます。

count(distinct AccessionDailyID)

行が乗算された場合でも、これはカウントを取得するために機能します。ちなみに、これはテーブルが各行に一意のIDを持っていることを前提としています。

ちなみに、結合プロセスで行が失われないようにするのLEFT OUTER JOINではなく、必ず使用することをお勧めします。INNER JOIN

于 2012-10-15T19:49:07.570 に答える