2014-04-22 44 views
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使用它們。謝謝你的幫助。

回答

0

這應該工作:

;with cte as 
(
    select id, count(*) as dayCount 
    from People p 
    join MyDates d on d.[Date] between p.dateRangeStart and p.dateRangeEnd 
    group by id 
) 
select p.id, p.name, isnull(cte.dayCount,0) as totalDaysWithinRange 
from cte 
right join People p on p.id = cte.id 
order by p.id 
+0

工作很好。謝謝。 –

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的理由。

+0

什麼是不使用的原因之一? – Metaphor

+0

只是我的意見在這裏,但他們是1)難以閱讀2)難以排除故障(而不是一個子查詢或臨時表)。 – Zak

相關問題