2013-10-14 4 views
-1

기본적으로 모든 일요일을 열 1에 나열한 후 두 번째 열에 각 날짜를 나열하는 쿼리가 있습니다. 그 일요일에 열렸던 항목 (칼럼 1의 날짜, 실제로는 요일 일 수있는 중요한 것은 열린 항목의 매주 스냅 샷을 얻는 것입니다). 예 :매주 일요일 또는 특정 요일에 계산 항목이 열림

Date    open items 
------------  --------------- 
2013-10-13   1650 
2013-10-06   1554 
2013-09-29   1788 
(cont down) 

내 데이터베이스에는 각 항목의 openDate 및 closedDate가 기록됩니다. 따라서 열 2에는 다음과 같은 것이 필요합니다. 열린 날짜가있는 총 항목 수를 계산하십시오. < = 열 1 날짜이며 닫힌 날짜 (항목은 아직 열려 있음) 또는 닫은 날짜> = 열 1 날짜 중 하나가 NULL입니다.

도와 주시면 감사하겠습니다. 나는이 쿼리가 현재의 제한된 SQL 능력의 한계를 넘었다 고 생각한다.

많은 감사 로보 - 테드

+2

아무 것도 시도해 보셨나요? – Kaf

+1

당신의 기술보다 위라고 생각하십니까? 그래서 지금까지 무엇을 시도 했습니까? ;-) – Darwind

+0

몇 일요일에보고 싶습니까? 지난 달? 작년? – Jaime

답변

0

는 SQL 서버에서 다음과 같은

create procedure dbo.DoSummary(@startdate datetime, @enddate datetime, @dow int) 
as 
set DateFIRST @dow; 

with cte (date) as (
    select case 
      when datepart(dw, @startdate) = 1 then @startdate 
      else dateadd(d,8-datepart(dw, @startdate), @startdate) 
      end as date 
    union all 
    select dateadd(d,7, date) 
    from cte where dateadd(d,7,date) < @enddate 
) 
select 
    cte.date, count(items.opened) as [Open] 
from 
    cte left outer join items on cte.date >= items.opened and cte.date < coalesce(items.closed, dateadd(d,1,cte.date)) 
    group by cte.date 

그런 다음 당신은 그냥

dbo.DoSummary '2001-01-01','2001-07-01', 7 

이 실행하려면 실행 할 수 있습니다.

요일 @dow 컨트롤을 사용하는 마지막 매개 변수, 7은 단순히 원료로 함수 본문을 사용할 수있는 저장 프로 시저를 만들 수있는 액세스 권한이없는

영업 이익으로 UPDATE 일요일

입니다 SQL. 나는 C#에서 ADO를 사용하는 예제를 제공 할 것이다.

using (var conn = new SqlConnection(connectionString)) { 
    using (var cmd = conn.CreateCommand()) { 
    cmd.CommandText = "set DateFIRST @dow; " + 
         "with cte (date) as (" + 
         "select case " + 
         "when datepart(dw, @startdate) = 1 then @startdate "+ 
         "else dateadd(d,8-datepart(dw, @startdate), @startdate) " + 
         "end as date " + 
         "union all " + 
         "select dateadd(d,7, date) " + 
         "from cte where dateadd(d,7,date) < @enddate " + 
         ") " + 
         "select cte.date, count(items.opened) as [Open] " + 
         "from cte " + 
         "left outer join items " + 
         "on cte.date >= items.opened " + 
         "and cte.date < coalesce(items.closed, dateadd(d,1,cte.date)) "+ 
         "group by cte.date "; 
    cmd.Parameters.AddWithValue("@startdate", new DateTime(2001,01,01)); 
    cmd.Parameters.AddWithValue("@enddate", new DateTime(2001,04,01)); 
    cmd.Parameters.AddWithValue("@dow", 7); 
    using (var reader = cmd.ExecuteReader()) { 
     while (reader.Read()) { 
     // do somthing with data 
     } 
    } 
    } 
} 
+0

안녕하세요 Bob 코드에 감사드립니다. 불행히도 데이터베이스에 '쓰기'권한이 없으므로 절차를 직접 설정할 수 없습니다. IT 부서에 이렇게하도록 요청할 수는 있지만 IT 부서의 우선 순위는 아닙니다. 이 문제를 처리 할 단일 쿼리가 있는지 알고 있습니까? ADO 레코드 집합에 대한 쿼리로 사용할 수있는 항목은 무엇입니까? 다시 한번 감사드립니다. – user2878967

+0

@ user2878967 C# ADO 예제로 답변이 업데이트되었습니다. 함수 본문을 사용하고 AD 파라미터로 매개 변수를 쿼리에 전달할 수 있습니다. –

관련 문제