当前位置: 代码迷 >> Sql Server >> 新手继续提问sql解决方案
  详细解决方案

新手继续提问sql解决方案

热度:50   发布时间:2016-04-27 12:59:44.0
新手继续提问sql
一张log表字段如下:
id | user_id | date | action

action值可为0或者1
每日每用户可有多次action

要统计的是每日,在那日之前一共有多少次action为1的操作

比如 2012-05-01之前一共有多少次action为1的操作,我会算每天的,不会算每天之前的总和。

希望各位高手指教

------解决方案--------------------
SQL code
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'logtable')BEGIN    DROP TABLE logtableENDGOCREATE TABLE logtable(    id INT,    userid INT,    actdate VARCHAR(10),    Doaction INT)GOINSERT INTO logtableSELECT 1,1,'2012-05-07',1 UNIONSELECT 2,1,'2012-05-07',0 UNIONSELECT 3,1,'2012-05-07',1 UNIONSELECT 4,1,'2012-05-08',1 UNIONSELECT 5,1,'2012-05-09',1 UNIONSELECT 6,2,'2012-05-07',1 UNIONSELECT 7,2,'2012-05-08',1 UNIONSELECT 8,2,'2012-05-08',1 UNIONSELECT 9,2,'2012-05-09',1 UNIONSELECT 10,2,'2012-05-09',1 UNIONSELECT 11,2,'2012-05-09',1select userid,actdate,SUM(case when Doaction=1 then 1 else 0 end) as timesfrom logtable where actdate<=getdate()--得到系统当前日期group by userid,actdateorder by userid,actdate/*userid    actdate    times1    2012-05-07    21    2012-05-08    12    2012-05-07    12    2012-05-08    2*/借楼上测试数据一用。我觉得你的统计结果存在问题SELECT 1,1,'2012-05-07',1 UNION--有这一行数据存在1    2012-05-07    0--这一行不对希望解释一下,是我没明白楼主的意思还是怎么的。谢谢了
------解决方案--------------------
SQL code
select *,(count(*) from log where userid=a.userid and [date]<a.[date] and action=1) from log a where [date] <'2012-05-01'
------解决方案--------------------
SQL code
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'logtable')BEGIN    DROP TABLE logtableENDGOCREATE TABLE logtable(    id INT,    userid INT,    actdate VARCHAR(10),    Doaction INT)GOINSERT INTO logtableSELECT 1,1,'2012-05-07',1 UNIONSELECT 2,1,'2012-05-07',0 UNIONSELECT 3,1,'2012-05-07',1 UNIONSELECT 4,1,'2012-05-08',1 UNIONSELECT 5,1,'2012-05-09',1 UNIONSELECT 6,2,'2012-05-07',1 UNIONSELECT 7,2,'2012-05-08',1 UNIONSELECT 8,2,'2012-05-08',1 UNIONSELECT 9,2,'2012-05-09',1 UNIONSELECT 10,2,'2012-05-09',1 UNIONSELECT 11,2,'2012-05-09',1--5月7日之前,不包括当日SELECT DISTINCT actdate,CASE WHEN (SELECT SUM(Doaction) FROM logtable AS B WHERE A.actdate > B.actdate) IS NULL THEN 0                             ELSE (SELECT SUM(Doaction) FROM logtable AS B WHERE A.actdate > B.actdate) END AS 操作次数FROM logtable AS Aactdate    操作次数2012-05-07    02012-05-08    32012-05-09    6--5月7日之前,包括当日SELECT DISTINCT actdate,CASE WHEN (SELECT SUM(Doaction) FROM logtable AS B WHERE A.actdate >= B.actdate) IS NULL THEN 0                             ELSE (SELECT SUM(Doaction) FROM logtable AS B WHERE A.actdate >= B.actdate) END AS 操作次数FROM logtable AS Aactdate    操作次数2012-05-07    32012-05-08    62012-05-09    10
  相关解决方案