2017-01-18 5 views
0

일별, 월별, 분기별로, 연간으로 판매 데이터 그룹을 생성하는 보고서를 작성하려고합니다. 제가 실행중인 문제는 일상적인 활동이 없다면 월별, 분기 별, 또는 연간 단위로 생성되지 않는다는 것입니다. 데이터가없는 요일에 0을 생성하고 다른 세 그룹을 계속 계산하려면 어떻게해야합니까? 다음은 사용하려는 코드입니다 (그룹으로 포함 된 연도가 아직 없음).일별, 월별, 분기 별, 연도 별 그룹 별 판매 데이터 생성

WITH Summary AS 
(SELECT 
    1 as GRP, 
    'DAILY' as Label, 
    O.SnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.DollarsBilled) = 0 THEN 0 ELSE SUM(O.DollarsBilled) END, 
    BilledMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE SUM(O.MsfBilled) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE (SUM(O.DollarsBilled)/SUM(O.MsfBilled)) END, 
    BilledContribution = CASE WHEN SUM(O.Contribution) = 0 THEN 0 ELSE SUM(O.Contribution) END, 
    BilledProfit = CASE WHEN SUM(O.Profit) = 0 THEN 0 ELSE SUM(O.Profit) END 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey = 20161230 and O.SalesRepKey = 167 
GROUP BY 
    O.SnapshotDateKey 

UNION 

SELECT 
    2 as GRP, 
    'MTD' as Label, 
    O.SnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.MTDDollarsBilled) = 0 THEN 0 ELSE (SUM(O.MTDDollarsBilled)) END, 
    BILLEDMSF = CASE WHEN SUM(O.MTDMsfBilled) = 0 THEN 0 ELSE (SUM(O.MTDMsfBilled)) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MTDMsfBilled) = 0 THEN 0 ELSE (SUM(O.MTDDollarsBilled)/SUM(O.MTDMsfBilled)) END, 
    SUM(O.MTDContribution) as BilledContribution, 
    SUM(O.MTDProfit) as BilledProfit 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey = 20161230 and O.SalesRepKey = 167 
GROUP BY 
    O.SnapshotDateKey 

UNION 

SELECT 
    3 as GRP, 
    'QTD' as Label, 
    O.SnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.QTDDollarsBilled) = 0 THEN 0 ELSE (SUM(O.QTDDollarsBilled)) END, 
    BILLEDMSF = CASE WHEN SUM(O.QTDMsfBilled) = 0 THEN 0 ELSE (SUM(O.QTDMsfBilled)) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.QTDMsfBilled) = 0 THEN 0 ELSE (SUM(O.QTDDollarsBilled)/SUM(O.QTDMsfBilled)) END, 
    SUM(O.QTDContribution) as BilledContribution, 
    SUM(O.QTDProfit) as BilledProfit 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey = 20161230 and O.SalesRepKey = 167 
GROUP BY 
    O.SnapshotDateKey 
) 

SELECT * FROM Summary 
UNION ALL SELECT NULL, 0,0,0,0,0 WHERE NOT EXISTS (SELECT * FROM Summary) 

고마워요!

+1

DB 플랫폼에 태그하십시오. – OldProgrammer

+0

감사합니다. 나는 그렇게했다. –

+0

플랫폼이 동시에 mysql & sql-server입니까? – McNets

답변

0

WHERE 절을 유니온 쿼리 포인트의 모든 부분으로 변경하여 데이터가 포함되거나 포함되지 않을 수있는 정확한 단일 날짜로 변경하는 것을 고려하십시오. 또한 업데이트 된 WHERE 조건이 행 수를 확장하므로 모든 부분에서 일별 집계를 반복합니다. MTD, QTD 또는 YTD 열을 유지할 필요가 없습니다. 모든 열은 GRP레이블 상수로 집계 될 수 있으므로 더하기 GROUP BY을 사용할 필요가 없습니다.

SnapshotDateKey은 숫자로 날짜를 캡처하는 것처럼 보이기 때문에 일일 외 기간에 적합한 범위를 필터링하면됩니다. 다음은 CTE 문에 대한 업데이트입니다 :

WITH Summary AS 

(SELECT 
    1 as GRP, 
    'DAILY' as Label, 
    MAX(O.SnapshotDateKey) AS MaxSnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.DollarsBilled) = 0 THEN 0 ELSE SUM(O.DollarsBilled) END, 
    BilledMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE SUM(O.MsfBilled) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE (SUM(O.DollarsBilled)/SUM(O.MsfBilled)) END, 
    BilledContribution = CASE WHEN SUM(O.Contribution) = 0 THEN 0 ELSE SUM(O.Contribution) END, 
    BilledProfit = CASE WHEN SUM(O.Profit) = 0 THEN 0 ELSE SUM(O.Profit) END 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey = 20161230 and O.SalesRepKey = 167 

UNION 

SELECT 
    2 as GRP, 
    'MTD' as Label, 
    MAX(O.SnapshotDateKey) AS MaxSnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.DollarsBilled) = 0 THEN 0 ELSE SUM(O.DollarsBilled) END, 
    BilledMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE SUM(O.MsfBilled) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE (SUM(O.DollarsBilled)/SUM(O.MsfBilled)) END, 
    BilledContribution = CASE WHEN SUM(O.Contribution) = 0 THEN 0 ELSE SUM(O.Contribution) END, 
    BilledProfit = CASE WHEN SUM(O.Profit) = 0 THEN 0 ELSE SUM(O.Profit) END 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey BETWEEN 20161201 AND 20161230 and O.SalesRepKey = 167 

UNION 

SELECT 
    3 as GRP, 
    'QTD' as Label, 
    MAX(O.SnapshotDateKey) AS MaxSnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.DollarsBilled) = 0 THEN 0 ELSE SUM(O.DollarsBilled) END, 
    BilledMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE SUM(O.MsfBilled) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE (SUM(O.DollarsBilled)/SUM(O.MsfBilled)) END, 
    BilledContribution = CASE WHEN SUM(O.Contribution) = 0 THEN 0 ELSE SUM(O.Contribution) END, 
    BilledProfit = CASE WHEN SUM(O.Profit) = 0 THEN 0 ELSE SUM(O.Profit) END 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey BETWEEN 20161001 AND 20161230 and O.SalesRepKey = 167 
) 

을 제외하고는 - 이상적으로, 당신은 날짜/시간 부분 일/주/월/분기/년 지표를 추출 유지 날짜 시간 필드를 사용합니다. 위와 같이 MTD, QTD, YTD에 대한 계산 세트가없는 DollarsBilled, MsfBilled, Contribution, Profit 열 집합 만 집계합니다.