0

私はテーブルを持っていますdbo.MyDates:

date
--------
'08/28/2012'
'01/10/2013'
'02/05/2013'

およびテーブルdbo.People:

id     name      dateRangeStart    dateRangeEnd
---    ------    --------------    ------------
100    Mike      '08/01/2012'      '11/15/2012'
101    John      '08/01/2012'      '02/01/2013'
102    Claire    '12/01/2012       '03/15/2013'
103    Mary      '03/01/2013'      '05/01/2013'

私がやろうとしているのは、行1〜3の各日付が特定の日付範囲内にあるかどうかを確認し、範囲内の日付の数を合計することです:

id     name      totalDaysWithinRange
---    ------    --------------------
100    Mike      1
101    John      2
102    Claire    2
103    Mary      0

totalDaysWithinRange簡単な数学計算でを使用できるようにします。Java や PHP などの他の言語の while ループの使用方法は知っていますが、私の調査によると、T-SQL では再帰 CTE を使用する方がよいようです。私は過去に CTE を使用したことがあるので、それらがどのように機能するかは知っていますが、再帰 CTE を使用したことはありません。これが私が思いついたものです:

WITH cte AS 
(
  SELECT
    p.id AS personID,
    p.name AS personName,
    p.dateRangeStart AS drs,
    p.dateRangeEnd AS dre,
    d.date AS checkedDate

  FROM dbo.MyDates AS d, dbo.People AS p
  WHERE d.date BETWEEN p.dateRangeStart AND p.dateRangeEnd
  UNION ALL
  SELECT
    cte.personID,
    cte.personName,
    cte.drs,
    cte.dre,
    cte.checkedDAte
    FROM cte
      INNER JOIN dbo.MyDates AS d
      ON d.date = cte.checkedDate   
)

SELECT
  p.id
  p.name,
  COUNT(cte.personID)
  FROM cte AS c
    INNER JOIN dbo.Person AS p ON p.id = c.personID)
;

私が理解できないのは、合計を で使用できるように合計を計算する方法SELECT from cteです。ご協力いただきありがとうございます。

4

2 に答える 2

0
SELECT P.id, P.name, ISNULL(A.totalDaysWithinRange, 0) totalDaysWithinRange 
FROM PEOPLE P 
LEFT JOIN (SELECT P.id, P.name, COUNT(*) totalDaysWithinRange
FROM PEOPLE P
JOIN MyDates D ON P.dateRangeStart < D.date 
AND D.date < P.dateRangeEnd
GROUP BY P.id, P.name) A ON A.ID = P.ID

SQLFIDDLE: http://sqlfiddle.com/#!3/073d9/14/0

CTE は、stackoverflow に関する多くの回答に表示されているようですが、CTE の目的に使用されることはめったにありません。この場合、CTE を使用する理由がわかりません。

于 2014-04-22T01:36:18.167 に答える