Sql server 2008 如何在一个查询中使用执行多个计算

Sql server 2008 如何在一个查询中使用执行多个计算,sql-server-2008,tsql,Sql Server 2008,Tsql,我的情况是,我必须从一年前、上个月和本月获取数据。实现这一目标的最佳方式是什么 我有一个表,其中包含年、月和数据。在下面的查询中添加了一个过滤器 c、 ReportMonth=DATENAMEmonth、@12个月Sago和c.ReportYear=Year@12MonthsAgo 这是一年前的事了。同样,如果我必须获得上个月和当前月份,我可以通过设置过滤器在同一查询中使用吗?我们怎么做 除了编写3个select查询,然后将select放入tmp表,然后合并表之外,还有更好的方法吗 create

我的情况是,我必须从一年前、上个月和本月获取数据。实现这一目标的最佳方式是什么

我有一个表,其中包含年、月和数据。在下面的查询中添加了一个过滤器 c、 ReportMonth=DATENAMEmonth、@12个月Sago和c.ReportYear=Year@12MonthsAgo 这是一年前的事了。同样,如果我必须获得上个月和当前月份,我可以通过设置过滤器在同一查询中使用吗?我们怎么做

除了编写3个select查询,然后将select放入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

我想你需要的是:

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

我对一年前、上个月和当前月份有点困惑,但听起来你需要将这3个字段转换成一个合适的datetime或datetime2,然后根据它进行计算。日期格式不是问题。我有上一年、上一年、下一年的所有计算结果。12个月的截止日期=DATEADDmm,-12,ReportDate,12上一个月的截止日期=DATEADDmm,-1,ReportDate;我的问题是在where子句中,我们将计算出的日期作为过滤器,如c.ReportMonth=DATENAMEmonth、@12MonthsAgo和c.ReportYear=Year@12MonthsAgoSame当月和上月的方式。要做到这一点,我必须再写两个选择并更新结果表。所以我的问题是,有没有比多写两篇精选文章更好的方法呢。我们可以在一个查询中完成此操作吗?
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