首页 新闻 会员 周边 捐助

一个 SQL 语句

0
悬赏园豆:50 [已解决问题] 解决于 2014-01-03 14:19

select convert(varchar(10),ReceiveTime,111) as '日期', count(Valid) as ' 总数',count(Valid) as '有效数',count(Valid) as '无效数'
from Conditions
where ReceiveTime between '2013-12-02' and '2013-12-20'  (这边where语句怎么判断Valid的值 有 0,1 两种可能 ,1有效 0 无效)
group by
 convert(varchar(10),ReceiveTime,111)
order by  convert(varchar(10),ReceiveTime,111) asc

 

感觉这样写的话 where那边不好同时写 Valid=0 或者 1 还有总数的情况

sql
青空下的思念的主页 青空下的思念 | 初学一级 | 园豆:4
提问于:2014-01-02 21:48
< >
分享
最佳答案
0

提供一种非主流的实现,你可以看看:

SELECT CONVERT(VARCHAR(10), ReceiveTime, 111) AS '日期',
       COUNT(Valid)  AS ' 总数',
       SUM(Valid)    AS '有效数',--sum(Valid),原本应该为sum(case when valid=1 then 1 else 0 end)
       SUM(CASE WHEN valid = 0 THEN 1 ELSE 0 END) AS '无效数'
FROM   Conditions
WHERE  ReceiveTime BETWEEN '2013-12-02' AND '2013-12-20'
GROUP BY
       CONVERT(VARCHAR(10), ReceiveTime, 111)
ORDER BY
       CONVERT(VARCHAR(10), ReceiveTime, 111) ASC
收获园豆:25
幻天芒 | 高人七级 |园豆:37205 | 2014-01-02 22:54

Valid 字段用的bit类型 提示说bit 数据类型对于sum运算符无效

青空下的思念 | 园豆:4 (初学一级) | 2014-01-03 13:41

Valid 字段用的bit类型 提示说bit 数据类型对于sum运算符无效 ..这个怎么办

青空下的思念 | 园豆:4 (初学一级) | 2014-01-03 13:41

@青空下的思念: 哈哈,你改为原本应该为的那条语句就可以了。呵呵~

幻天芒 | 园豆:37205 (高人七级) | 2014-01-03 14:05

@幻天芒: 额 行了 - - 新手 请见谅 哈哈 谢谢帮忙哈~

青空下的思念 | 园豆:4 (初学一级) | 2014-01-03 14:09

@青空下的思念:此方法非主流,哈哈~ 

幻天芒 | 园豆:37205 (高人七级) | 2014-01-03 14:34

@幻天芒: 啊 。 那一般实现类似功能怎么写的哈 感觉 一步一步 蛮对的哇 。

青空下的思念 | 园豆:4 (初学一级) | 2014-01-03 14:37

@青空下的思念:子查询,用count计数,应该是正途。这个用到了sum求和函数。 

幻天芒 | 园豆:37205 (高人七级) | 2014-01-03 15:17

@幻天芒:  多谢前辈指教啦 哈哈~

青空下的思念 | 园豆:4 (初学一级) | 2014-01-06 09:41

@青空下的思念: O(∩_∩)O哈哈~

幻天芒 | 园豆:37205 (高人七级) | 2014-01-06 11:56
其他回答(3)
0

你这个问题问得太乱了,应该把无关的参数先简化,比如那个ReceiveTime不是你要问的,你就不要搞那么复杂。

按我的理解,你想要的大概可以这么解决:

Select ReceiveTime, sum(ValidCount) as TotalValidCount, sum(NoValidCount) as TotalNoValidCount

  from

  (Select ReceiveTime, Case When Valid=1 then 1 else 0 end as ValidCount, Case When Valid=0 then 1 else 0 end as NoValidCount  where Condition)M

      group by ReceiveTime

 

ReceiveTime的复杂性你再去代入吧。

收获园豆:10
爱编程的大叔 | 园豆:30844 (高人七级) | 2014-01-02 22:12

 写的是有点乱了 这个习惯不太好 哈哈 请问一下 其中的M 是什么意思啊 是指表吗 试了一下 好像不对 

支持(0) 反对(0) 青空下的思念 | 园豆:4 (初学一级) | 2014-01-03 13:39
0

1楼说的对,将复杂的问题进行简单的分解。

不过

在首先运用case when的时候还是需要加入日期的过滤条件

Select ReceiveTime, Case When Valid=1 then 1 else 0 end as ValidCount, Case When Valid=0 then 1 else 0 end as NoValidCount  from Conditions
where ReceiveTime between '2013-12-02' and '2013-12-20'

然后运用group by 进行分组,sum对两种值进行汇总求和即可,因为在case when中就是将符合条件的记录进行计数为1.

收获园豆:10
aehyok | 园豆:1212 (小虾三级) | 2014-01-02 22:44

是的  以后得慢慢学会这样 把复杂问题简单化 感谢指导

支持(0) 反对(0) 青空下的思念 | 园豆:4 (初学一级) | 2014-01-03 13:49
0

看楼上都回答了,解决问题,分而治之,逐步分解,一步一步的来,这样思路明了清晰,学会养成这种,

收获园豆:5
秋壶冰月 | 园豆:5903 (大侠五级) | 2014-01-02 23:00

恩啊 谢谢前辈指导 有些习惯不太好 得慢慢纠正了 .

支持(0) 反对(0) 青空下的思念 | 园豆:4 (初学一级) | 2014-01-03 13:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册