2013-03-21 1 views
1

내가 걸린 것처럼 도움이 필요합니다. 이것은 SQL과 Coldfusion을 사용하고 있습니다. 기본적으로 나는 특정 표를 완료 한 날짜와 함께 표를 완성한 표를 가지고 있습니다. 이 테이블에는 GROUP BY에서 사용되는 예를 들어 지구 및 면적이 있습니다. 그래서 저는 매주 한 번에 한 티켓을 모두 집계하기를 원합니다. 사용자는 보고서를 실행하는 등의 작업을 선택합니다. 나는 지금 내가 가지고있는 SQL을 약간 나열 할 것이다.출력 1 년 동안 주 간격으로 일부 열의 합계, 일과 일치하는 날짜

SELECT           
    SUM(CASE WHEN DATEPART(ww, completionDate) = 1 THEN 1 ELSE 0 END) AS [Jan1-7], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 2 THEN 1 ELSE 0 END) AS [Jan8-14], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 3 THEN 1 ELSE 0 END) AS [Jan15-21], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 4 THEN 1 ELSE 0 END) AS [Jan22-31]  
    SUM(CASE WHEN DATEPART(ww, completionDate) = 5 THEN 1 ELSE 0 END) AS [Feb1-7], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 6 THEN 1 ELSE 0 END) AS [Feb8-14], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 7 THEN 1 ELSE 0 END) AS [Feb15-21], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 8 THEN 1 ELSE 0 END) AS [Feb22-28], 

당신은 내가 기본적으로 completionDate이었다 년의 어느 주에 자신의 칼럼에서 그 합산 잡기 위해 노력하고 볼 수 있듯이. 다른 사람이 더 좋은 제안을하지 않는 한이 형식이어야합니다. 문제는 예를 들어, 2/18/2013입니다. 예를 들어, SQL은 내 코드에 따라 제 7 번째 주인 FEB15-21에서 내 코드가 SUM과 같지만 2013 년 8 번째 주라고 알려줍니다. 필요한 보고서는 맨 위 헤더에 달을 표시 한 다음 그 달의 다음 헤더에 매주 표시 한 다음 기본적으로 그 주에 완료된 모든 티켓 수를 계산하는 것입니다. 따라서 주/월은 기둥이되어야합니다.

일부 CF 기능을 모두 읽었지만 필자는 필요한 기능을 활용하는 방법을 잘 모릅니다. 이 날짜를 동적으로 합산하여 주를 기반으로 정확한 열에 SUMMED되거나 Coldfusion을 사용하여이 부분을 처리 할 수있는 방법이 있습니까? 그러나 ColdFusion 부분에서도 확신 할 수는 없으므로 가능하면 SQL 또는 CF를 사용하고 코드 부분에서 나를 도와 주겠다는 제안은 정말 감사 할 것입니다.

감사합니다.

+2

1 월 22-31 일주일은 어떻게 될까요? 9 일 .... – ljh

+0

주간 실제 주가가 아닌 이유는 무엇입니까? –

+0

[이 질문에 대한 답변] (http://stackoverflow.com/questions/15515679/select-with-count-for-years/15515954#15515954)을 참조하십시오. 이 답변은 월별 날짜 수집을 기반으로하지만 주 (또는 일 또는 시간 등)에 쉽게 적용 할 수 있습니다. –

답변

0

기본 키가 날짜 인 데이터베이스 테이블을 만드는 것이 좋습니다. 이 테이블의 다른 필드에는 주 문자열 (Jan 7 - 13) 외에 필요한 정보, 휴일, 회계 정보 등이 포함됩니다.

일부 항목에 대해서는 유지 관리 스크립트가 필요하며 수동으로 휴일 부분을 수행해야 할 수도 있습니다. 데이터웨어 하우스에서 우리가하는 일입니다.

현재 시도중인 보고서를 매우 간단하게 만듭니다.

0

나는 정확하게 따르고 있지만 100 % 확신 할 수는 없지만이 쿼리를 사용하면 좋습니다. 이렇게하면 주당/월별 조합의 빈도가 계산되어 출력시 원하는대로 주별 또는 월별로 분할 할 수 있습니다. 그런 다음 CF 로직을 사용하여 출력 목적으로 제한 날짜를 결정할 수 있습니다. 이것은 당신이 질문을 명확히하십시오 생각했던 것은 꽤 종류가 아닌 경우

SELECT 

    -- Get the week and month of each row 
    MONTH(completionDate) AS monthOfYear, 
    WEEK(completionDate) AS weekOfYear, 

    -- Count how many rows are in this group 
    COUNT(*) AS frequency 

FROM yourTable AS yt 

-- If you are only interested in a specific date range, chuck in something like this 
WHERE yt.completionDate BETWEEN DATE('2013-01-01') AND ('2013-12-30') 

-- Order by month and then week, so that week 4 in Jan comes before week 4 in Feb 
GROUP BY 
    monthOfYear ASC, 
    weekOfYear ASC 

는 희망이, 도움이됩니다.

이 매우 큰 테이블이며 일 통계의 끝 부분에만 관심이있는 경우, 간단한 열 statsDate DATE NOT NULL PK와 구조 statsFrequency INTEGER UNSIGNED NOT NULL

INSERT INTO yourStatsTable(
    statsDate, 
    statsFrequency 
) 
SELECT 
    DATE(completionDate), 
    COUNT(*) 
FROM yourTable AS yt 
WHERE yt.completionDate >= SUBDATE(CURRENT_DATE,1) 
AND yt.completionDate < CURRENT_DATE 
ON DUPLICATE KEY UPDATE statsFrequency = VALUES(statsFrequency) 
와 테이블에 매일 후에 다음과 같은 것을 실행 해보십시오

이렇게하면 주 테이블을 치지 않고 쿼리 할 수있는 이전 일 수에 대한 테이블이 제공됩니다 (단, 큰/바쁜 테이블 인 경우에만 수행하고 실행 중에는 생성 할 수 없습니다)

0

나는 당신을 혼란스럽게하는 부분이 MSSQL이 우리를 어떻게 대하고 있는지 생각한다. ek 번호. 그것들은 모두 월 - 일주 형식입니다.이 경우 1 주일은 2012 년 12 월 31 일 월요일부터 일요일 1/6/13까지 (이고 2012 년 1 월 1 일부터 2012 년 1 월 7 일까지이라고 가정합니다.), 2 주차 : 1/7/13 ~ 1/13/13 등 ... 2/18/2013은 8 주 (월요일)에 시작되므로 올해 8 번째 주에 있습니다. 시작과 끝 날짜를 얻고 절과 요약하여 그룹에서 사용하는

DATEADD(ww, DATEDIFF(ww,0,completionDate), 0) AS [Start Of Week], 
DATEADD(s,-1,DATEADD(ww, DATEDIFF(ww,0,GETDATE())+1,0)) as [End Of Week] 

:

당신은 같은 것을 사용하는 것이 좋습니다.

코드와 일치 시키려면 [Start Of Week] 및 [End Of Week]에 오프셋 일 수를 추가하여 범위를 가져올 수 있습니다. 2013 년 1 월 1 일부터 2012 년 12 월 31 일까지 2012 년 1 월 1 일에 1 일 (2012 년 1 월 1 일) 오프셋이 적용됩니다 (sql start of year). 날짜는 모두 [Jan1-7] 주 형식과 일치합니다.

희망이 도움이됩니다. -Minh