【问题标题】:sql query sum countsql查询总和计数
【发布时间】:2014-08-06 07:48:28
【问题描述】:

我有一张桌子

id  date      state
1   10.01.01  reg
2   08.01.01  reg
3   05.01.01  check
4   02.01.01  check
5   01.01.01  reg

想要显示这样的结果

count   reg
5       1

例如,只有当前一个状态是“检查”时,才应计算“注册”状态的总和。 请帮助我或给出正确的方向来解决它

【问题讨论】:

  • 你的数据库引擎和版本是什么

标签: sql count sum aggregate-functions


【解决方案1】:

SQL Server 2012 及以上中,您可以使用 LAG 访问上一行的值:

SQL SERVER 2012

;WITH MyCTE AS
(
  select id, date,state,lag(state,1) over(order by id) as prevstate
  from Table1
)
SELECT COUNT(*),SUM(CASE WHEN state = 'reg' AND prevstate = 'check' THEN 1 ELSE 0 END)
FROM MyCTE

Fiddler Demo

甲骨文

With T AS
(
select "id", "date", "state",  lag("state",1) over(order by "id") as "prevstate"
from Table1
)
SELECT COUNT(*),SUM(CASE WHEN "state" = 'reg' AND "prevstate" = 'check' THEN 1 ELSE 0 END)  
FROM T

Fiddler Demo

MySQL

SELECT COUNT(*),SUM(CASE WHEN state = 'reg' AND prevstate = 'check' THEN 1 ELSE 0 END)
FROM
(
  SELECT T1.ID,T1.Date,T1.state,T2.state AS prevstate
  FROM Table1 T1
  LEFT JOIN Table1 T2
  ON T1.ID - 1 = T2.ID
) AS T

Fiddler Demo

实际上,第三种情况几乎适用于所有情况。

【讨论】:

    猜你喜欢
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    相关资源
    最近更新 更多