当前位置: 代码迷 >> SQL >> 用SQL语句查询之后,返回不存在的值,用0代替
  详细解决方案

用SQL语句查询之后,返回不存在的值,用0代替

热度:61   发布时间:2016-05-05 11:11:08.0
用SQL语句查询以后,返回不存在的值,用0代替
最近在弄一个统计图,碰到几个问题:

?

数据库: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了。

最后的结果是:


?

2where后面根据不同的情况执行不同的查询条件

这个问题要是放在页面或后台处理很简单,但我这个必须用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)

是不是很简单!?

?

3SQL里面的相除问题

如果用简单的/相除得到的只是整数,根本就拿不到指定的小数位。这里引用一下人家的:

?

参考地址1http://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%

?

参考地址2http://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)   的形式整理结果。

?

?

  相关解决方案