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 还有总数的情况
提供一种非主流的实现,你可以看看:
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
Valid 字段用的bit类型 提示说bit 数据类型对于sum运算符无效
Valid 字段用的bit类型 提示说bit 数据类型对于sum运算符无效 ..这个怎么办
@青空下的思念: 哈哈,你改为原本应该为的那条语句就可以了。呵呵~
@幻天芒: 额 行了 - - 新手 请见谅 哈哈 谢谢帮忙哈~
@青空下的思念:此方法非主流,哈哈~
@幻天芒: 啊 。 那一般实现类似功能怎么写的哈 感觉 一步一步 蛮对的哇 。
@青空下的思念:子查询,用count计数,应该是正途。这个用到了sum求和函数。
@幻天芒: 多谢前辈指教啦 哈哈~
@青空下的思念: O(∩_∩)O哈哈~
你这个问题问得太乱了,应该把无关的参数先简化,比如那个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的复杂性你再去代入吧。
写的是有点乱了 这个习惯不太好 哈哈 请问一下 其中的M 是什么意思啊 是指表吗 试了一下 好像不对
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.
是的 以后得慢慢学会这样 把复杂问题简单化 感谢指导
看楼上都回答了,解决问题,分而治之,逐步分解,一步一步的来,这样思路明了清晰,学会养成这种,
恩啊 谢谢前辈指导 有些习惯不太好 得慢慢纠正了 .