请教大家一个SQL问题,在线等,谢谢

风云再起9310 2017-06-28 10:50:12
场景描述:现在公司需要统计每个月用户预存的余额,Consume表是用来记录用户预存流水的;ConsumeType表示流水类型,1表示预存,3表示消费;BeginDate表示操作时间;PrincipalBalance表示当前的余额;

需求描述:现在公司需要统计所有用户,每个月月底的余额。

如图所示,我给大家查询出一部分数据,仅供大家参考,谢谢,在线等

...全文
198 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-06-28
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([workshopid] int,[BeginData] Date,[PrincipalBalance] int)
Insert #T
select 1,'2016-10-14',100 union all
select 1,'2016-10-17',70 union all
select 2,'2016-10-14',100 union all
select 2,'2016-10-15',60 union ALL
select 2,'2016-11-15',60 union all
select 3,'2016-10-14',100
Go
--测试数据结束
SELECT CONVERT(NVARCHAR(6), #T.[BeginData], 112) AS [BeginMonth] ,
SUM([PrincipalBalance]) AS [PrincipalBalance]
FROM #T
JOIN ( SELECT [workshopid] ,
CONVERT(NVARCHAR(6), [BeginData], 112) AS [BeginMonth] ,
MAX([BeginData]) AS [BeginData]
FROM #T
GROUP BY [workshopid] ,
CONVERT(NVARCHAR(6), [BeginData], 112)
) t ON t.BeginData = #T.BeginData
AND t.workshopid = #T.workshopid
GROUP BY CONVERT(NVARCHAR(6), #T.[BeginData], 112)


风云再起9310 2017-06-28
  • 打赏
  • 举报
回复
引用 13 楼 u012012237 的回复:
[quote=引用 12 楼 sinat_28984567 的回复:] [quote=引用 11 楼 u012012237 的回复:] [quote=引用 10 楼 sinat_28984567 的回复:]
很接近了,你刚刚提供的是按天来分组的,能帮我改为按月分组的么?谢谢[/quote] 按的是最后一天。每个用户是都有最后一天的记录吗?还是有的用户没有也需要计算。 不如用户1 10月31号100 用户2 没有10月31号 但是10月30号有值 200有这种情况吗?[/quote] 不一定每个用户都有最后一天记录,例如,2017年5月份,16号你消费了,剩下余额为50元,然后16号之后,截至5月份,你都没有消费了,所以你的5月份最后记录是16号;我5月份23号消费了,剩下余额80元,然后截至5月份,我都没有消费了;小明5月份31号消费了,剩下余额100元。所以,所有的用户,5月份的余额总数为:50+80+100=230元。 温馨提示:现在是想以月为单位统计所有用户余额,例如,上面我写到的,5月份所有人的余额为230元。谢谢,[/quote] 哥们,你可以这样理解,例如,计算5月份所有用户的余额总和,需要找到所有用户5月份最后一条记录,然后sum(PrincipalBalance)。其他月份以此类推,谢谢啦。
风云再起9310 2017-06-28
  • 打赏
  • 举报
回复
引用 12 楼 sinat_28984567 的回复:
[quote=引用 11 楼 u012012237 的回复:] [quote=引用 10 楼 sinat_28984567 的回复:]
很接近了,你刚刚提供的是按天来分组的,能帮我改为按月分组的么?谢谢[/quote] 按的是最后一天。每个用户是都有最后一天的记录吗?还是有的用户没有也需要计算。 不如用户1 10月31号100 用户2 没有10月31号 但是10月30号有值 200有这种情况吗?[/quote] 不一定每个用户都有最后一天记录,例如,2017年5月份,16号你消费了,剩下余额为50元,然后16号之后,截至5月份,你都没有消费了,所以你的5月份最后记录是16号;我5月份23号消费了,剩下余额80元,然后截至5月份,我都没有消费了;小明5月份31号消费了,剩下余额100元。所以,所有的用户,5月份的余额总数为:50+80+100=230元。 温馨提示:现在是想以月为单位统计所有用户余额,例如,上面我写到的,5月份所有人的余额为230元。谢谢,
二月十六 2017-06-28
  • 打赏
  • 举报
回复
引用 11 楼 u012012237 的回复:
[quote=引用 10 楼 sinat_28984567 的回复:]
很接近了,你刚刚提供的是按天来分组的,能帮我改为按月分组的么?谢谢[/quote] 按的是最后一天。每个用户是都有最后一天的记录吗?还是有的用户没有也需要计算。 不如用户1 10月31号100 用户2 没有10月31号 但是10月30号有值 200有这种情况吗?
风云再起9310 2017-06-28
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
很接近了,你刚刚提供的是按天来分组的,能帮我改为按月分组的么?谢谢
二月十六 2017-06-28
  • 打赏
  • 举报
回复
二月十六 2017-06-28
  • 打赏
  • 举报
回复
不分用户是吗?就是所有人每月最后一天的和?
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([workshopid] int,[BeginData] Date,[PrincipalBalance] int)
Insert #T
select 1,'2016-10-14',100 union all
select 1,'2016-10-31',70 union all
select 2,'2016-10-15',100 union all
select 2,'2016-10-31',60 union ALL
select 2,'2016-11-30',60 union all
select 3,'2016-10-31',100
Go
--测试数据结束
SELECT #T.[BeginData] ,
SUM(#T.[PrincipalBalance]) AS allPrincipalBalance
FROM #T
JOIN ( SELECT CONVERT(NVARCHAR(6), [BeginData], 112) AS [BeginMonth] ,
MAX([BeginData]) AS [BeginData]
FROM #T
GROUP BY CONVERT(NVARCHAR(6), [BeginData], 112)
) t ON t.BeginData = #T.BeginData
GROUP BY #T.[BeginData]


风云再起9310 2017-06-28
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([workshopid] int,[BeginData] Date,[PrincipalBalance] int)
Insert #T
select 1,'2016-10-14',100 union all
select 1,'2016-10-17',70 union all
select 2,'2016-10-14',100 union all
select 2,'2016-10-15',60 union ALL
select 2,'2016-11-15',60 union all
select 3,'2016-10-14',100
Go
--测试数据结束
SELECT  #T.[workshopid] ,
        #T.[BeginData] ,
        #T.[PrincipalBalance]
FROM    #T
        JOIN ( SELECT   [workshopid] ,
                        CONVERT(NVARCHAR(6), [BeginData], 112) AS [BeginMonth] ,
                        MAX([BeginData]) AS [BeginData] 
               FROM     #T
               GROUP BY [workshopid] ,
                        CONVERT(NVARCHAR(6), [BeginData], 112)
             ) t ON t.BeginData = #T.BeginData
                    AND t.workshopid = #T.workshopid
你上面提供的脚本,是统计所有用户, 每个月月底的余额总和吗??例如,2017年5月,你的余额有50元,我的余额有80元,那么2017年5月 总的余额为:50+80=130 温馨提示:workshopid用不上的,
风云再起9310 2017-06-28
  • 打赏
  • 举报
回复
引用 5 楼 zhouyuehai1978 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T(workshopid INT,begindate DATETIME,PrincipalBalance NUMERIC(18,2))
Insert #T
select 1,'2017-1-1',100 UNION ALL
select 1,'2017-1-31',101 UNION  ALL
select 1,'2017-2-7',102 UNION  ALL
select 1,'2017-2-11',103 UNION  ALL
select 2,'2017-1-1',104 UNION  ALL
select 2,'2017-1-6',105 
Go
--测试数据结束
SELECT *
FROM   (
           SELECT t.*,
                  ROW_NUMBER() OVER(
                      PARTITION BY workshopid,
                      YEAR(begindate),
                      MONTH(begindate) ORDER BY t.begindate DESC
                  )   AS nt
           FROM   #T  AS t
       ) a
WHERE  nt = 1
你上面提供的脚本,是统计所有用户, 每个月月底的余额总和吗??例如,2017年5月,你的余额有50元,我的余额有80元,那么2017年5月 总的余额为:50+80=130
二月十六 2017-06-28
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([workshopid] int,[BeginData] Date,[PrincipalBalance] int)
Insert #T
select 1,'2016-10-14',100 union all
select 1,'2016-10-17',70 union all
select 2,'2016-10-14',100 union all
select 2,'2016-10-15',60 union ALL
select 2,'2016-11-15',60 union all
select 3,'2016-10-14',100
Go
--测试数据结束
SELECT #T.[workshopid] ,
#T.[BeginData] ,
#T.[PrincipalBalance]
FROM #T
JOIN ( SELECT [workshopid] ,
CONVERT(NVARCHAR(6), [BeginData], 112) AS [BeginMonth] ,
MAX([BeginData]) AS [BeginData]
FROM #T
GROUP BY [workshopid] ,
CONVERT(NVARCHAR(6), [BeginData], 112)
) t ON t.BeginData = #T.BeginData
AND t.workshopid = #T.workshopid


zhouyuehai1978 2017-06-28
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T(workshopid INT,begindate DATETIME,PrincipalBalance NUMERIC(18,2))
Insert #T
select 1,'2017-1-1',100 UNION ALL
select 1,'2017-1-31',101 UNION ALL
select 1,'2017-2-7',102 UNION ALL
select 1,'2017-2-11',103 UNION ALL
select 2,'2017-1-1',104 UNION ALL
select 2,'2017-1-6',105
Go
--测试数据结束
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER(
PARTITION BY workshopid,
YEAR(begindate),
MONTH(begindate) ORDER BY t.begindate DESC
) AS nt
FROM #T AS t
) a
WHERE nt = 1

风云再起9310 2017-06-28
  • 打赏
  • 举报
回复
引用 3 楼 zhouyuehai1978 的回复:
那你不是只需要查出每个用户每个月最后一条记录不就行了?
嗯嗯,,可以这样理解,如果是单个用户,只需要查出每个月最后一条记录的余额就行了;但是现在是查询所有用户,每个月月底的余额。
zhouyuehai1978 2017-06-28
  • 打赏
  • 举报
回复
那你不是只需要查出每个用户每个月最后一条记录不就行了?
风云再起9310 2017-06-28
  • 打赏
  • 举报
回复
引用 1 楼 zhouyuehai1978 的回复:
用户是哪个字段,workshopid吗?
我刚才上面截图的,我是查询某个用户的预存,主要是方便大家参考。实际上,现在是需要查询所有用户的,所以不需要筛选workshopid,
zhouyuehai1978 2017-06-28
  • 打赏
  • 举报
回复
用户是哪个字段,workshopid吗?
zhouyuehai1978 2017-06-28
  • 打赏
  • 举报
回复
把我的结果集汇总一下不就好了
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T(workshopid INT,begindate DATETIME,PrincipalBalance NUMERIC(18,2))
Insert #T
select 1,'2017-1-1',100 UNION ALL
select 1,'2017-1-31',101 UNION ALL
select 1,'2017-2-7',102 UNION ALL
select 1,'2017-2-11',103 UNION ALL
select 2,'2017-1-1',104 UNION ALL
select 2,'2017-1-6',105
Go
--测试数据结束

SELECT YEAR(a.begindate) AS 年,MONTH(a.begindate) AS 月,SUM(a.PrincipalBalance) AS 余额
FROM (
SELECT t.*,
ROW_NUMBER() OVER(
PARTITION BY workshopid,
YEAR(begindate),
MONTH(begindate) ORDER BY t.begindate DESC
) AS nt
FROM #T AS t
) a
WHERE nt = 1
GROUP BY YEAR(a.begindate),MONTH(a.begindate)
ORDER BY YEAR(a.begindate),MONTH(a.begindate)

593

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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