2013-11-01 5 views
1

나는 1 년 전, 지난 달 및 현재 달에서 데이터를 가져와야하는 상황이 있습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?단일 쿼리에서 여러 계산을 수행하는 방법

나는 년, 월 및 데이터가 들어있는 테이블이 있습니다. 아래의 쿼리에서 필터를 추가했습니다. c.ReportMonth = DATENAME (월, @ 12MonthsAgo) 및 c.ReportYear = Year (@ 12MonthsAgo) 이것은 1 년 전입니다. 같은 방법으로 이전 달과 현재 달을 가져와야하는 경우 필터를 설정하여 동일한 쿼리에서이를 수행 할 수 있습니까? 어떻게해야합니까?

내가 3 개의 선택 쿼리를 작성한 다음 선택을 tmp 테이블에 넣고 나중에 테이블을 병합하는 것 이외의 다른 방법이 있습니까?

create table #TPTABLE 
(
    KPIName varchar(150) 
    ,MetricName Varchar(200) 
    ,MetricId INT 
    ,DataSource varchar(50) 
    ,[AnYearAgo] Float 
    ,[PreviousMonth] float 
    ,[CurrentMonth] float 
); 


insert into #TPTABLE 
(KPIName,MetricName,MetricId,DataSource,[AnYearAgo]) 
SELECT 
    p.KPIName 
    ,p.MetricName 
    ,p.MetricId 
    ,p.DataSource 
    ,c.Value as [AnYearAgo] 
    FROM [IntegratedCare].[report].[KPIMetricDetails] p 
    LEFT JOIN [IntegratedCare].[report].[KPIMectricValues] c 
    ON p.[MetricId] = c.MetricId 
    WHERE c.ReportMonth = DATENAME(month, @12MonthsAgo) and c.ReportYear = Year(@12MonthsAgo) 
    ORDER BY KPI_Id ASC, [MetricId] ASC 
+0

나는 "년 전, 이전 월과 현재의 달"로 조금 혼란 스러워요하지만 당신은 변환해야처럼 소리 3 개의 필드를 적절한''datetime'' (또는''datetime2'')에 추가하고이를 기반으로 계산하십시오. – acfrancis

+0

날짜 형식은 문제가되지 않습니다. 전년도, 올해는 작년에 계산할 수 있습니다. 12MonthsAgo AS DATE = DATEADD (mm, -12, ReportDate), 12 이전 월의 날짜 = DATEADD (mm, -1, ReportDate); 내 문제는 where 절에서 계산 된 날짜를 필터로 제공합니다. where c.ReportMonth = DATENAME (월, @ 12MonthsAgo) 및 c.ReportYear = Year (@ 12MonthsAgo) – user2919277

+0

현재 월 및 전월과 같은 방식 . 그렇게하기 위해서는 2 개의 select를 작성하고 결과 테이블을 갱신해야합니다. 그래서 내 질문은, 거기에 더 많은 선택을 작성하는 것보다 더 좋은 방법입니다. 단일 쿼리에서이 작업을 수행 할 수 있습니까? – user2919277

답변

0
SELECT 
    p.KPIName 
    ,p.MetricName 
    ,p.MetricId 
    ,p.DataSource 
    ,c.Value 
    ,c2.Value 
    ,c3.Value 
    FROM [IntegratedCare].[report].[KPIMetricDetails] p 
    LEFT JOIN [IntegratedCare].[report].[KPIMectricValues] c 
    ON p.[MetricId] = c.MetricId 
     AND c.[CommissionerCode] = COALESCE(NULLIF(@Commissioner, ''), c.[CommissionerCode]) 
     ANd ReportMonth = DATENAME(month, @12MonthsAgo) and c.ReportYear = Year(@12MonthsAgo) 
    LEFT JOIN [IntegratedCare].[report].[KPIMectricValues] c2 
    ON p.[MetricId] = c2.MetricId 
     AND c2.[CommissionerCode] = COALESCE(NULLIF(@Commissioner, ''), c2.[CommissionerCode]) 
     ANd c2.ReportMonth = DATENAME(month, @PreviousMonth) and c2.ReportYear = Year(@PreviousMonth) 
    LEFT JOIN [IntegratedCare].[report].[KPIMectricValues] c3 
    ON p.[MetricId] = c3.MetricId 
     AND c3.[CommissionerCode] = COALESCE(NULLIF(@Commissioner, ''), c3.[CommissionerCode]) 
     ANd c3.ReportMonth = DATENAME(month, @PreviousMonth) and c3.ReportYear = Year(@PreviousMonth) 
    ORDER BY p.KPI_Id ASC, p.[MetricId] ASC 
0

나는 당신이 필요로하는 것은이 생각 :

insert into #TPTABLE 
(KPIName,MetricName,MetricId,DataSource,[AnYearAgo]) 
SELECT 
    KPIName 
    ,MetricName 
    ,MetricId 
    ,DataSource 
    ,[AnYearAgo] 
    ,[PreviousMonth] 
    ,[CurrentMonth] 
FROM (
    SELECT 
     KPIName 
     ,MetricName 
     ,MetricId 
     ,DataSource 
     ,KPI_Id 
     ,sum(case when c.ReportMonth = DATENAME(month, @12MonthsAgo) and c.ReportYear = Year(@12MonthsAgo) then c.Value else 0 end) as [AnYearAgo] 
     ,sum(case when c.ReportMonth = DATENAME(month, @PreviousMonth) and c.ReportYear = Year(@PreviousMonth) then c.Value else 0 end) as [PreviousMonth] 
     ,sum(case when c.ReportMonth = DATENAME(month, @CurrentMonth) and c.ReportYear = Year(@CurrentMonth) then c.Value else 0 end) as [CurrentMonth] 
    FROM [IntegratedCare].[report].[KPIMetricDetails] p 
    LEFT JOIN [IntegratedCare].[report].[KPIMectricValues] c 
    ON p.[MetricId] = c.MetricId 
    GROUP BY KPIName, MetricName, MetricId, DataSource, KPI_Id 
ORDER BY KPI_Id ASC, [MetricId] ASC 
관련 문제