数据库:MS SQL Server 2005
1、用SQL语句查询以后,返回不存在的值,用0代替。
基本业务是这样的:我需要统计历年和今年的数据,这个项目是从今年开始的,不可能存在历年的数据,但是这一列必须显示出来,没有数据用0代替。
目前的情况:
最开始我是用isnull(field1,0)判断直接取0,结果返回记录为空,然后,用case when field1='' then 0,还是什么结果都没有。于是百度。搜到了一篇,终于解决我的问题了。
地址:http://www.myexception.cn/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 field9
FROM yearPramAndConView
WHERE field1 <> year(getDate())
union all
SELECT
'历史' 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 field9
FROM 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了。
最后的结果是:
2、where后面根据不同的情况执行不同的查询条件这个问题要是放在页面或后台处理很简单,但我这个必须用SQL处理。
基本页面时这样子的:
我需要根据“时间范围”查询不同的结果,譬如说点击“今年”的“合同”时得查询今年的合同,点击“本周”的得显示本周的。
网上说where后面可以跟case when,根据指定的条件进行判断,基本格式是:
where field1= case when =1 then 1
when =2 then 2
......
end
其中
这个方法我这儿不适用,因为我的查询条件是变动的,用case when 来表示就是:
where case when =1 then field1 is not null
when =2 then field1 is not null and field2 is not null
......
en
这种结构执行起来是会报错的。
后来在网上看到一个类似的问题,说用Or可以解决问题,果然不错。
这是参考地址:
http://zhidao.baidu.com/link?url=wyBsJX5DiPGdUNrwq9Col8NR8cbU9HsFchkZ7PucVr82eN8y6qc2tjrErBwAKael_zHZrWB2jNtpV8IXf45Z7K
最后的解决方法:
(''='今年' and year(field46)=year(GETDATE()) ) OR
(''='上周' and (DATEDIFF(week,field46,getDate())=1)) OR
(''='本周' and (DATEDIFF(week,field46,getDate())=0)) OR
(''='累计' 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=decimal
CONVERT(decimal(10,2),42*100.0/96) AS '百分数dec', --100 与 100.0是不一样的
CONVERT(decimal(10,2),42*100/96) AS '没有保留到小数点'
--from Tb
order 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 )/343
select str((4*100.0)/(20*1.0),5,2)
select str((165*100.0)/(343*1.0),5,2)
--如果要保留固定小数位,使用 cast(xxxxxx,10,2) 的形式整理结果。