1

SQL Server Management Studio 2005でストアドプロシージャを作成して、月ごとと年ごとの2つの異なる期間の状態とポリシーカウントのリストを返します。Reporting Servicesレポートで使用するために必要なデータとストアドプロシージャを収集するために、いくつかのビューを作成しました。

以下は私のストアドプロシージャです。

SELECT DISTINCT
    S.[State],
    COUNT(HP_MTD.PolicyID) AS PolicyCount_MTD,
    COUNT(HP_YTD.PolicyID) AS PolicyCount_YTD
FROM tblStates S
    LEFT OUTER JOIN vwHospitalPolicies HP_MTD ON S.[State] = HP.[State]
        AND HP.CreatedDate BETWEEN DATEADD(MONTH, -1, GETDATE()) AND GETDATE()
    LEFT OUTER JOIN vwHospitalPolicies HP_YTD ON S.[State] = HP.[State]
        AND HP.CreatedDate BETWEEN DATEADD(YEAR, -1, GETDATE()) AND GETDATE()
GROUP BY S.[State]
ORDER BY S.[State] ASC

私が遭遇している問題は、2番目のLEFT OUTER JOINが追加されたときに、2番目の結合を参照していないCOUNT()でさえ、カウントが肥大化していることです。すべての州が特定の期間のポリシーを持っているわけではないので、左参加が必要ですが、それでもレポートに表示されるはずです。

任意の提案をいただければ幸いです!

4

2 に答える 2

2

必要なようです:

COUNT(DISTINCT HP_MTD.PolicyID) AS PolicyCount_MTD,
COUNT(DISTINCT HP_YTD.PolicyID) AS PolicyCount_YTD

それ以外の:

COUNT(HP_MTD.PolicyID) AS PolicyCount_MTD,
COUNT(HP_YTD.PolicyID) AS PolicyCount_YTD

元のクエリには、2番目の結合に一致する行の数が含まれています。DISTINCT内部に句を追加するCOUNTと、PolicyIDの一意のオカレンスに制限されます。

于 2012-04-13T15:33:58.180 に答える
0

私はこの種の作業にはCTEを好みます-それらは基本的に一種のインラインビューです。

実際の問題は、一部のポリシーが両方のカウント列で2回カウントされていることです(1回は月初来、もう1回は年初来)。したがって、次のようなソーステーブルがある場合:

year-to-date
state   policy
==================
1       1
1       2
1       3
2       4

month-to-date
state   policy
==================
1       1
1       2

JOINs(評価される前)の結果テーブルはCOUNT次のようになります。

temp
state  monthPolicy  yearPolicy
================================
1      1            1
1      1            2
1      1            3
1      2            1
1      2            2
1      2            3
2      -            4

明らかにあなたが望むものではありません。多くの場合、解決策は、CTEまたは他のテーブル参照を使用して、最終的な結合の合計レコードを提示することです。このようなもの:

WITH PoliciesMonthToDate (state, count) as (
                          SELECT state, COUNT(*)
                          FROM vwHospitalPolicies
                          WHERE createdDate >= DATEADD(MONTH, -1, GETDATE())
                          AND createdDate < DATEADD(DAY, 1, GETDATE())
                          GROUP BY state),
     PoliciesYearToDate (state, count) as (
                         SELECT state, COUNT(*)
                         FROM vwHospitalPolicies
                         WHERE createdDate >= DATEADD(YEAR, -1, GETDATE())
                         AND createdDate < DATEADD(DAY, 1, GETDATE())
                         GROUP BY state)
SELECT a.state, COALESCE(b.count, 0) as policy_count_mtd, 
                COALESCE(c.count, 0) as policy_count_ytd
FROM tblStates a
LEFT JOIN PoliciesMonthToDate b
ON b.state = a.state
LEFT JOIN PoliciesYearToDate c
ON c.state = a.state
ORDER BY a.state

(マイナーな落とし穴-テーブルとビューにプレフィックスを使用しないでください。ノイズであり、何らかの理由でそれらを切り替えると、コードを変更する必要があります。そうしないと、名前が誤解を招く可能性があります)

于 2012-04-13T16:02:36.540 に答える