Sql 使用case创建多列数据

Sql 使用case创建多列数据,sql,sql-server,Sql,Sql Server,我正在尝试在MS SQL 2005中创建一个查询,该查询将在我的结果集中作为单独的列返回4个日期范围的数据 现在,我的查询与下面的查询类似。它工作正常,但是我想为每个日期范围添加额外的列,因为它当前支持一个日期范围 这将返回一个total1、total2、total3和total4列,而不是像下面的当前查询那样返回一个total列。每个总数将代表4个日期范围: 我相当肯定这可以通过使用案例陈述来完成,但我不是100% 任何帮助都将不胜感激 SELECT vendor,loca

我正在尝试在MS SQL 2005中创建一个查询,该查询将在我的结果集中作为单独的列返回4个日期范围的数据

现在,我的查询与下面的查询类似。它工作正常,但是我想为每个日期范围添加额外的列,因为它当前支持一个日期范围

这将返回一个total1、total2、total3和total4列,而不是像下面的当前查询那样返回一个total列。每个总数将代表4个日期范围:

我相当肯定这可以通过使用案例陈述来完成,但我不是100%

任何帮助都将不胜感激

 SELECT  
       vendor,location,
      sum(ExtPrice) as total 

  FROM [database].[dbo].[saledata]
where processdate between '2010-11-03' and '2010-12-14'

and location <>''
and vendor <> ''

group by vendor,location with rollup
使用子查询,即

select sd.vendor, sd.location, sd1.total, sd2.total, sd3.total, sd4.total
from (select distinct vendor, location from saledata) AS sd
LEFT JOIN (
 SELECT vendor,location, sum(ExtPrice) as total 
  FROM [database].[dbo].[saledata]
where processdate between 'startdate1' and 'enddate1'
and location <>''
and vendor <> ''
group by vendor,location with rollup) sd1 on sd1.vendor=sd.vendor and sd1.location=sd.location

LEFT JOIN (
 SELECT vendor,location, sum(ExtPrice) as total 
  FROM [database].[dbo].[saledata]
where processdate between 'startdate2' and 'enddate2'
and location <>''
and vendor <> ''
group by vendor,location with rollup) sd2 on sd2.vendor=sd.vendor and sd2.location=sd.location

LEFT JOIN (
 SELECT vendor,location, sum(ExtPrice) as total 
  FROM [database].[dbo].[saledata]
where processdate between 'startdate3' and 'enddate3'
and location <>''
and vendor <> ''
group by vendor,location with rollup) sd3 on sd3.vendor=sd.vendor and sd3.location=sd.location

LEFT JOIN (
 SELECT vendor,location, sum(ExtPrice) as total 
  FROM [database].[dbo].[saledata]
where processdate between 'startdate4' and 'enddate4'
and location <>''
and vendor <> ''
group by vendor,location with rollup) sd4 on sd4.vendor=sd.vendor and sd4.location=sd.location

我通常是这样做的:

 SELECT  
       vendor,location,
      sum(CASE WHEN processdate BETWEEN @date1start AND @date1end THEN xtPrice ELSE 0 END) as total,
      sum(CASE WHEN processdate BETWEEN @date2start AND @date2end THEN xtPrice ELSE 0 END) as total2, 
      sum(CASE WHEN processdate BETWEEN @date3start AND @date3end THEN xtPrice ELSE 0 END) as total3, 
      sum(CASE WHEN processdate BETWEEN @date4start AND @date4end THEN xtPrice ELSE 0 END) as total4     
  FROM [database].[dbo].[saledata]

and location <>''
and vendor <> ''

group by vendor,location with rollup

您还可以更改WHEN部分以设置所需的日期范围。

是的,非常感谢,这很有效。在这种情况下,我也在尝试下面的方法。我可以将返回的空值设为0吗?我尝试了isnull,但似乎没有强制执行0@joe-我相信运行此查询的成本高于我的查询。“无意冒犯,”史蒂夫卡夫说。joe,尝试在查询分析器中运行这两个查询,并查看每个查询的运行时间和成本,以进行比较。我认为您关于查询成本的看法是正确的。我刚刚意识到,如果数据低于某个日期,我需要从旧数据库中提取数据,这不允许我在当前状态下使用您的查询。是的,我完全同意Beemer的解决方案是更好的。是的,但我必须使用你的解决方案Steve,因为我需要更改特定日期范围的数据库。用代码将null更改为0的最佳方法是什么?