读书人

关于sql语句中多where条件的写法

发布时间: 2012-08-07 14:54:49 作者: rapoo

求助关于sql语句中多where条件的写法?
有一查询功能根据提供的时间段返回某字段值。 例如:
select 字段1 from 表1 where time between 时间1 and 时间2;

由于时间段会有多个 ,所以如上语句会有多条,只是时间段不同,例如:
select 字段1 from 表1 where time between 时间1 and 时间2;
select 字段1 from 表1 where time between 时间3 and 时间4;
select 字段1 from 表1 where time between 时间5 and 时间6;
……
有么有什么方法可将上面的多条语句合成为一条,只用一次select即可实现多个时间段的查询,得到类似如下结果
列1 列2 列3
字段1 字段1 字段1

忘各位高人提供思路,谢谢

[解决办法]
行列转换

SQL code
--行列互转--摘自中国风博客,引用请标明内容来源--1、行换列if object_id('Class') is not  null    drop table ClassGoCreate table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)Insert Classselect N'张三',N'语文',78 union allselect N'张三',N'数学',87 union allselect N'张三',N'英语',82 union allselect N'张三',N'物理',90 union allselect N'李四',N'语文',65 union allselect N'李四',N'数学',77 union allselect N'李四',N'英语',65 union allselect N'李四',N'物理',85 Go--2000方法:--动态:declare @s nvarchar(4000)set @s=''Select @s=@s+','+quotename([Course])+'=max(case when [Course]='           +quotename([Course],'''')+' then [Score] else 0 end)'from     Class group by[Course]--select @sexec('select [Student]'+@s+' from Class group by [Student]')--生成静态:select     [Student],    [数学]=max(case when [Course]='数学' then [Score] else 0 end),    [物理]=max(case when [Course]='物理' then [Score] else 0 end),    [英语]=max(case when [Course]='英语' then [Score] else 0 end),    [语文]=max(case when [Course]='语文' then [Score] else 0 end) from     Class group by [Student]GO--动态:declare @s nvarchar(4000)Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]select @sexec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')--生成静态:select * from     Class pivot     (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b--生成格式:/*Student 数学         物理         英语         语文------- ----------- ----------- ----------- -----------李四     77          85          65          65张三     87          90          82          78(2 行受影响)*/go--加上总成绩(学科平均分)--2000方法:--动态:declare @s nvarchar(4000)set @s=''Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)'from Class group by[Course]exec('select [Student]'+@s+',[总成绩]=sum([Score])  from Class group by [Student]')--加多一列(学科平均分用avg([Score]))生成动态:select     [Student],    [数学]=max(case when [Course]='数学' then [Score] else 0 end),    [物理]=max(case when [Course]='物理' then [Score] else 0 end),    [英语]=max(case when [Course]='英语' then [Score] else 0 end),    [语文]=max(case when [Course]='语文' then [Score] else 0 end),    [总成绩]=([Score]) --加多一列(学科平均分用avg([Score]))from     Class group by [Student]go--2005方法:动态:declare @s nvarchar(4000)Select  @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') 去掉字符串@s中第一个逗号exec('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a pivot (max([Score]) for [Course] in('+@s+'))b ')--生成静态:select     [Student],[数学],[物理],[英语],[语文],[总成绩] from     (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])pivot     (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b 生成格式:/*Student 数学         物理         英语         语文         总成绩------- ----------- ----------- ----------- ----------- -----------李四     77          85          65          65          292张三     87          90          82          78          337(2 行受影响)*/go--2、列转行 if not object_id('Class') is null    drop table ClassGoCreate table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)Insert Classselect N'李四',77,85,65,65 union allselect N'张三',87,90,82,78Go--2000:动态:declare @s nvarchar(4000)select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all+',[Score]='+quotename(Name)+' from Class'from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列order by Colidexec('select * from ('+@s+')t order by [Student],[Course]')--增加一个排序生成静态:select * from (select [Student],[Course]='数学',[Score]=[数学] from Class union all select [Student],[Course]='物理',[Score]=[物理] from Class union all select [Student],[Course]='英语',[Score]=[英语] from Class union all select [Student],[Course]='语文',[Score]=[语文] from Class)t order by [Student],[Course]go--2005:动态:declare @s nvarchar(4000)select @s=isnull(@s+',','')+quotename(Name)from syscolumns where ID=object_id('Class') and Name not in('Student') order by Colidexec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')goselect     Student,[Course],[Score] from     Class unpivot     ([Score] for [Course] in([数学],[物理],[英语],[语文]))b生成格式:/*Student Course Score------- ------- -----------李四     数学     77李四     物理     85李四     英语     65李四     语文     65张三     数学     87张三     物理     90张三     英语     82张三     语文     78*/ 


[解决办法]
请贴具体的测试数据和结果集看,看楼主表述的感觉像是行转列,但又有些不对。。。
[解决办法]

SQL code
select max(case when time between 时间1 and 时间2 then 字段1 end) as 字段1,  max(case when time between 时间3 and 时间4 then 字段1 end) as 字段1,  max(case when time between 时间5 and 时间6 then 字段1 end) as 字段1from 表1where time between 时间1 and 时间6 

读书人网 >SQL Server

热点推荐