sql怎么实现last non empty的功能?

lxljw1314 2016-04-27 05:29:52
如下所示,表里有日期,部门,金额,人次 字段,我想求20160401到20160403 这三天各个部门的金额和人次,金额可以直接sum,但是这个人次不是直接求和,要用最后一个非空日期对应的值,即20160403所对应的各部门值。怎么把两个度量值在一个语句里求出来呢?可以实现吗?
想要的结果是:
DEP ZJE RC
1001 306 7
1002 606 24
1003 906 1
1004 1206 15
1005 1506 3
------------------------------------------------------------------------------
DATE DEP ZJE RC
20160401 1001 101 11
20160401 1002 201 5
20160401 1003 301 8
20160401 1004 401 2
20160401 1005 501 22
20160402 1001 102 14
20160402 1002 202 3
20160402 1003 302 6
20160402 1004 402 9
20160402 1005 502 12
20160403 1001 103 7
20160403 1002 203 24
20160403 1003 303 1
20160403 1004 403 15
20160403 1005 503 3
...全文
213 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-04-28
  • 打赏
  • 举报
回复
;WITH a 
AS
(
SELECT * ,ROW_NUMBER()OVER(PARTITION BY DEP ORDER BY Date DESC) AS RN FROM 表 WHERE   Date BETWEEN '20160401' AND '20160403'
)
SELECT  DEP
       ,ZJE = SUM(ZJE)
       ,RC = max(CASE WHEN RN=1 THEN  RC ELSE 0 END)
FROM  a
WHERE   Date BETWEEN '20160401' AND '20160403'
GROUP BY DEP;
lxljw1314 2016-04-28
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
select DEP, ZJE=sum(ZJE) , RC=sum( RC) from 表 where Date between '20160401' and '20160403' group by DEP
这不就是两个sum么?我的人次RC只要最后一个日期的值
中国风 2016-04-28
  • 打赏
  • 举报
回复
周几计算公式
DECLARE @dt datetime
SET @dt=GETDATE()

DECLARE @number int
SET @number=1--周1


SELECT DATEADD(Day,@number-(DATEPART(dw,@dt)+@@DATEFIRST-2)%7-1,@dt)
lxljw1314 2016-04-28
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
Date BETWEEN DATEADD(dd,-DATEPART(dw,GETDATE()-8),CONVERT(VARCHAR(10),GETDATE(),120))-6 AND DATEADD(dd,-DATEPART(dw,GETDATE()-8),CONVERT(VARCHAR(10),GETDATE(),120))
条件改为上周一到周日,这类型判断就好是传参,把日期参数由程序去传
十分感谢,做了些测试,确实可以呢。但是为什么可以通过这个公式求得上周一到周日,还是没理解,不知道什么原理。。。
中国风 2016-04-28
  • 打赏
  • 举报
回复
Date BETWEEN DATEADD(dd,-DATEPART(dw,GETDATE()-8),CONVERT(VARCHAR(10),GETDATE(),120))-6 AND DATEADD(dd,-DATEPART(dw,GETDATE()-8),CONVERT(VARCHAR(10),GETDATE(),120))
条件改为上周一到周日,这类型判断就好是传参,把日期参数由程序去传
lxljw1314 2016-04-28
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
;WITH a 
AS
(
SELECT * ,ROW_NUMBER()OVER(PARTITION BY DEP ORDER BY Date DESC) AS RN FROM 表 WHERE   Date BETWEEN '20160401' AND '20160403'
)
SELECT  DEP
       ,ZJE = SUM(ZJE)
       ,RC = max(CASE WHEN RN=1 THEN  RC ELSE 0 END)
FROM  a
WHERE   Date BETWEEN '20160401' AND '20160403'
GROUP BY DEP;
感谢大神提供思路!!牛! 如果我这里的日期是动态的该怎么办呢?比如默认要上周的区间,上周一到周日之间的数据。是不是要做周数的判断再比较呢
中国风 2016-04-27
  • 打赏
  • 举报
回复
select DEP, ZJE=sum(ZJE) , RC=sum( RC) from 表 where Date between '20160401' and '20160403' group by DEP

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧