0

このクエリがあります。明確な日数をカウントするために、医療請求に関する DOS と比較するために使用するカレンダーを作成します。

実行すると、結果に表示されない行がいくつかドロップされるようです。

これらの行がこのクエリでカウントされない理由を誰でも見ることができますか?

ICN サービス開始日 サービス終了日 詳細ステータスコード
12345 20121102 12:00:00 20121103 12:00:00 P
12345 20121102 12:00:00 20121103 12:00:00 P
12345 20121102 12:00:00 20121103 12:00:00 P
12345 20121102 12:00:00 20121103 12:00:00 D
12345 20121102 12:00:00 20121103 12:00:00 D
12345 20121102 12:00:00 20121103 12:00:00 D
12345 20121102 12:00:00 20121103 12:00:00 D
12345 20121102 12:00:00 20121103 12:00:00 D
CREATE TABLE #Calendar1(Dt DATETIME NOT NULL PRIMARY KEY);
;WITH cte AS
(
    SELECT CAST('20120101' AS DATETIME) AS c 
    UNION ALL
    SELECT DATEADD(dd,1,c) FROM cte 
    WHERE c < '20131231'
)
INSERT INTO #Calendar1 SELECT c FROM cte OPTION  (MAXRECURSION 1);


SELECT
    ICN,
    COUNT(DISTINCT Dt) AS Days
FROM
    AllOPBYDOS s
    INNER JOIN #Calendar1 c ON
        s.[from Date of service] >= c.Dt AND s.[to Date of service] < c.Dt+1
--Where [Detail Status Code] = 'p'

GROUP BY
    ICN;
4

1 に答える 1

0

SQL Server 2008 でカレンダー クエリを実行すると、1 行しか生成されません。私はあなたが欲しいと思います:

INSERT INTO #Calendar1 SELECT c FROM cte OPTION  (MAXRECURSION 0);

削除された行について、カレンダーの範囲内に日付があることを確認しますか? おそらく、左外部結合を実行して、両極端をチェックする必要があります。

SELECT ICN, COUNT(DISTINCT Dt) AS Days,
       sum(case when [from Date of service] not between const.mindt and const.maxdt or
                     [to Date of service] not between const.mindt and const.maxdt
                then 1
                else 0
           end) as OutOfRangeRecords
FROM AllOPBYDOS s left outer JOIN
     #Calendar1 c
     ON s.[from Date of service] >= c.Dt AND s.[to Date of service] < c.Dt+1 cross join
     (select MAX(dt) as maxdt, MIN(dt) as mindt from #Calendar1) const
GROUP BY ICN;
于 2013-02-21T16:14:19.227 に答える