0

nullの場合でも、クエリに渡されたすべての注文のすべてのカウントを取得する必要があります。私はSQLServer2008R2でそのような種類のクエリを開発しました。

SELECT COUNT(UserId), b.OrderId
FROM @OrderList b
LEFT JOIN 
(
    SELECT DISTINCT pat_base.UserId, prov_list.OrderId
    FROM Users pat_base
    LEFT JOIN Assetments hlth_asmt ON hlth_asmt.UserId = pat_base.UserId
        AND hlth_asmt.Date BETWEEN @StartDate AND @EndDate
    LEFT JOIN Logs proc_log ON proc_log.UserId = pat_base.UserId 
        AND proc_log.PLDATE BETWEEN @StartDate AND @EndDate
    LEFT JOIN Encounter med_enc_log ON med_enc_log.UserId = pat_base.UserId
        AND med_enc_log.EncounterDate BETWEEN @StartDate AND @EndDate
    LEFT JOIN @OrderList prov_list ON
        hlth_asmt.OrderId = prov_list.OrderId
        OR proc_log.OrderId = prov_list.OrderId
        OR med_enc_log.OrderId = prov_list.OrderId
    WHERE hlth_asmt.UserId IS NOT NULL
        OR proc_log.UserId IS NOT NULL
    OR med_enc_log.UserId IS NOT NULL
) a ON a.OrderId=b.OrderId
GROUP BY b.OrderId

結合されたサブクエリを削除すると、多対多の関係で順序がカットされます。サブクエリを結合に置き換えることは可能ですか?

PSここに出力されます:

            OrderId
----------- -----------
8           10001
0           10003

サブクエリなしの出力:

            OrderId
----------- -----------
8           10001
4

2 に答える 2

1

あなたは変わらなければなりません

LEFT JOIN @OrderList prov_list ON

RIGHT JOIN @OrderList prov_list ON

左結合を使用する場合、@OrderList にあるが期待されるユーザーがいない注文を除外します

クエリは次のようになります

SELECT COUNT(UserId), prov_list.OrderId
    FROM Users pat_base
    LEFT JOIN Assetments hlth_asmt ON hlth_asmt.UserId = pat_base.UserId
        AND hlth_asmt.Date BETWEEN @StartDate AND @EndDate
    LEFT JOIN Logs proc_log ON proc_log.UserId = pat_base.UserId 
        AND proc_log.PLDATE BETWEEN @StartDate AND @EndDate
    LEFT JOIN Encounter med_enc_log ON med_enc_log.UserId = pat_base.UserId
        AND med_enc_log.EncounterDate BETWEEN @StartDate AND @EndDate
    RIGHT JOIN @OrderList prov_list ON
        hlth_asmt.OrderId = prov_list.OrderId
        OR proc_log.OrderId = prov_list.OrderId
        OR med_enc_log.OrderId = prov_list.OrderId
    WHERE hlth_asmt.UserId IS NOT NULL
        OR proc_log.UserId IS NOT NULL
    OR med_enc_log.UserId IS NOT NULL
group by prov_list.OrderId

編集

ええ、それは、これらの行が where 句で除外されたことを意味します

に変更します

WHERE hlth_asmt.UserId IS NOT NULL
OR proc_log.UserId IS NOT NULL
OR med_enc_log.UserId IS NOT NULL
OR pat_base IS NULL

しかし、それが意味することは、db内に一貫性のないデータがあるということだと思います

于 2013-01-18T10:07:35.690 に答える
1

単一のクエリから結果を返すことができますが、結合を使用しないことをお勧めします。代わりに、外側のクエリを削除し、内側のクエリに変更して、カウントでウィンドウ関数を使用します。したがって、SELECT 句は次のようになります。

SELECT DISTINCT
   pat_base.UserId,
   prov_list.OrderId,
   COUNT(pat_base.UserId) OVER (PARTITION BY prov_list.OrderId) as UserCount
于 2013-01-18T10:12:44.107 に答える