当前位置: 代码迷 >> Sql Server >> 问一个SQL查询语句,该怎么处理
  详细解决方案

问一个SQL查询语句,该怎么处理

热度:50   发布时间:2016-04-24 09:08:00.0
问一个SQL查询语句
本帖最后由 flyskytoday 于 2015-03-26 15:30:54 编辑
如表mytable
里面两个列,一个ID,一个为数字(双精度型)
ID Floor
1  -2
2  -1
3  -2.1
4  1
5  2
6  1.2
7  2.3
...

现在我要写个查询语句
select XX as 地上层数, XX as 地下层数, XX as 总层数, XX as 楼上最大值值为
form mytable

(查询规则为:所有小数都取整,比如2.3只能算是2,-2.1算-2
现在上面例子结果应该是:地上2层,地下2层,总共4层,楼上最大值为2(就是2.3取整)
请问大家,语句如何写啊
------解决思路----------------------
Select ID,
FLOOR(Case When MAX(Floors) <= 0 Then 0 Else MAX(Floors) End) As 地上层数,
FLOOR(Case When MIN(Floors) >= 0 Then 0 Else 0 -MIN(Floors) End) As 地下层数,
FLOOR(Case When MAX(Floors) <= 0 Then 0 Else MAX(Floors) End) + FLOOR(Case When MIN(Floors) >= 0 Then 0 Else 0 -MIN(Floors) End) As 总层数
From @MyTable
Group By ID

------解决思路----------------------
SELECT CAST(MAX(CASE WHEN[Floor]>0 THEN[Floor]END)AS INT)AS[地上层数]
,-CAST(MIN(CASE WHEN[Floor]<0 THEN[Floor]END)AS INT)AS[地下层数]
,CAST(MAX(CASE WHEN[Floor]>0 THEN[Floor]END)AS INT)-CAST(MIN(CASE WHEN[Floor]<0 THEN[Floor]END)AS INT)AS[总层数]
,CAST(MAX(CASE WHEN[Floor]>0 THEN[Floor]END)AS INT)AS[楼上最大值值为]
FROM mytable

------解决思路----------------------

create table mytable
(ID int,[Floor] decimal(5,1))

insert into mytable
 select 1,-2 union all
 select 2,-1 union all
 select 3,-2.1 union all
 select 4,1 union all
 select 5,2 union all
 select 6,1.2 union all
 select 7,2.3


select count(distinct case when [Floor]>0 then round([Floor],0) else null end) '地上层数',
       count(distinct case when [Floor]<0 then round([Floor],0) else null end) '地下层数',
       count(distinct round([Floor],0)) '总层数',
       cast(max(distinct case when [Floor]>0 then round([Floor],0) else null end) as int) '楼上最大值值'
 from mytable

/*
地上层数      地下层数     总层数      楼上最大值值
----------- ----------- ----------- -----------
2           2           4           2

(1 row(s) affected)
*/
  相关解决方案