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