?
数据库:MS SQL Server 2005
?
?1、用SQL语句查询以后,返回不存在的值,用0代替。
?基本业务是这样的:我需要统计历年和今年的数据,这个项目是从今年开始的,不可能存在历年的数据,但是这一列必须显示出来,没有数据用0代替。
?
?目前的情况:
?
要达到的结果:
?
?最开始我是用isnull(field1,0)判断直接取0,结果返回记录为空,然后,用case when field1='' then 0,还是什么结果都没有。于是百度。搜到了一篇,终于解决我的问题了。
?地址:http://www.daimami.com/sql-server/1079534.html
?具体解决代码如下:
SELECT '历史' AS field1, field1 AS field2, field2 AS field3, field3 AS field4, field4 AS field5, field5 AS field6, field6 AS field7, field7 AS field8, field8 AS field9FROM yearPramAndConViewWHERE field1 <> year(getDate())union allSELECT '历史' AS field1, 0 AS field2, 0 AS field3, 0 AS field4, 0 AS field5, 0 AS field6, 0 AS field7, 0 AS field8, 0 AS field9FROM yearPramAndConView where NOT EXISTS(SELECT 1 FROM yearPramAndConView WHERE field1 <>year(getDate()))
解释一下:union all前面的SQL查询出来的结果是不存在的,也就是图1那样,没有结果。union all后面那一段是进行判断,判断当前条件下yearPramAndConView中是否有数据,如果没有数据(NOT EXISTS)就union all后面这个用0代替的数据。如果有数据,这个条件就不成立了,也就不会再union all了。
最后的结果是:
?
这个问题要是放在页面或后台处理很简单,但我这个必须用SQL处理。
基本页面时这样子的:
?
我需要根据“时间范围”查询不同的结果,譬如说点击“今年”的“合同”时得查询今年的合同,点击“本周”的得显示本周的。
网上说where后面可以跟case when,根据指定的条件进行判断,基本格式是:
where field1= case when <M1>=1 then 1 when <M1>=2 then 2 ...... end
?其中<M1>是参数。
?
这个方法我这儿不适用,因为我的查询条件是变动的,用case when 来表示就是:
where case when <M1>=1 then field1 is not null when <M2>=2 then field1 is not null and field2 is not null ...... en
?这种结构执行起来是会报错的。
?
后来在网上看到一个类似的问题,说用Or可以解决问题,果然不错。
这是参考地址:
http://zhidao.baidu.com/link?url=wyBsJX5DiPGdUNrwq9Col8NR8cbU9HsFchkZ7PucVr82eN8y6qc2tjrErBwAKael_zHZrWB2jNtpV8IXf45Z7K
?
最后的解决方法:
('<M1>'='今年' and year(field46)=year(GETDATE()) ) OR ('<M1>'='上周' and (DATEDIFF(week,field46,getDate())=1)) OR ('<M1>'='本周' and (DATEDIFF(week,field46,getDate())=0)) OR ('<M1>'='累计' and field46 is not null)
是不是很简单!?
?
3、SQL里面的相除问题
如果用简单的/相除得到的只是整数,根本就拿不到指定的小数位。这里引用一下人家的:
?
参考地址1:http://blog.csdn.net/lanqiao825/article/details/6227859
--SQL中的相除SELECT CASE WHEN ISNULL(A+B,0)<>0 THEN LTRIM(CONVERT(DEC(18,2),A*100.0/(A+B)))+'%' ELSE '' END AS '百分数' FROM TB --百分比的不同格式select LTRIM(CONVERT(DEC(18,2),42*100.0/96))+'%' AS '百分数string' ,--DEC=decimalCONVERT(decimal(10,2),42*100.0/96) AS '百分数dec', --100 与 100.0是不一样的CONVERT(decimal(10,2),42*100/96) AS '没有保留到小数点'--from Tborder by 百分数dec desc--43.75% 43.75 43.00 --方法二:Select (Convert(varchar(50),Round(42*100.0/96,3))+'%') as 百分比 --from A--43.750000%
?
参考地址2:http://guiqingfeng.blog.163.com/blog/static/123357420082150115879/
--两个数中任意一个转换为浮点数后,整型的就会转换为浮点数再进行运算select cast cast ( 165*100 as float )/343select str((4*100.0)/(20*1.0),5,2) select str((165*100.0)/(343*1.0),5,2) --如果要保留固定小数位,使用 cast(xxxxxx,10,2) 的形式整理结果。
?
?