这个SUM分组怎么解决,求教

czyoooo 2018-03-22 05:09:10
这个SUM分组怎么解决,求教

ID TOTAL KIND 日期
B11 10 苹果 2018-01-03
B11 50 香蕉 2018-01-05
B11 -20 梨 2018-03-03
B22 -50 葡萄 2018-03-08

要求SUM后得这样的效果,SUM(TOTAL)后,日期取最后一条
B11 40 梨 2018-03-03
B22 -50 葡萄 2018-03-08
...全文
1446 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjiecao123 2018-07-13
  • 打赏
  • 举报
回复
;WITH CET1 AS (
SELECT t.id,
SUM(t.TOTAL) AS TOTAL
FROM t AS t
GROUP BY
t.id
),
CET2 AS(
SELECT t.id,
t.TOTAL,
t.KIND,
t.theDate
FROM t AS t
WHERE t.theDate = (
SELECT MAX(t2.theDate)
FROM t AS t2
WHERE t2.id = t.id
)
)

SELECT CET1.id,
CET1.TOTAL,
CET2.KIND,
CET2.theDate
FROM CET1
JOIN CET2
ON CET1.id = CET2.id
中国风 2018-03-23
  • 打赏
  • 举报
回复
e.g.
WITH CTET(id , TOTAL , KIND ,theDate )
AS (
select 'B11',10,'苹果','2018-01-03'
union all select 'B11',50,'香蕉','2018-01-05'
union all select 'B11',-20,'梨','2018-03-03'
union all select 'B22',-50,'葡萄','2018-03-08'
)
SELECT a.id
     , a.TOTAL
     , b.KIND
     , b.theDate
FROM
(SELECT id, SUM(TOTAL) AS TOTAL FROM CTET GROUP BY id) AS a
CROSS APPLY
(SELECT TOP 1
     KIND
   , theDate
 FROM CTET
 WHERE id=a.id
 ORDER BY theDate DESC) AS b;
 /*
 id	TOTAL	KIND	theDate
B11	40	梨	2018-03-03
B22	-50	葡萄	2018-03-08
*/
laj0600310219 2018-03-23
  • 打赏
  • 举报
回复
分完组统计的时候,直接用max(日期)作为不就可以了
二月十六 2018-03-22
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] nvarchar(23),[TOTAL] int,[KIND] nvarchar(22),[日期] Date)
Insert #T
select N'B11',10,N'苹果','2018-01-03' union all
select N'B11',50,N'香蕉','2018-01-05' union all
select N'B11',-20,N'梨','2018-03-03' union all
select N'B22',-50,N'葡萄','2018-03-08'
Go
--测试数据结束
SELECT ID,TOTAL,KIND,日期
FROM ( SELECT ID ,
SUM(TOTAL) OVER ( PARTITION BY ID ) AS TOTAL ,
KIND ,
日期 ,
ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY 日期 DESC ) AS rn
FROM #T
) t
WHERE rn = 1


吉普赛的歌 2018-03-22
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(id varchar(10), TOTAL INT, KIND nvarchar(10),theDate date)
insert into t
select 'B11','10','苹果','2018-01-03'
union all select 'B11','50','香蕉','2018-01-05'
union all select 'B11','-20','梨','2018-03-03'
union all select 'B22','-50','葡萄','2018-03-08'

select a.id,a.total,b.kind,b.theDate from (
	select id,sum(total) as total 
	from t
	group by id
) as a
inner join (
	select ROW_NUMBER() over(partition by id order by theDate desc) as rid,* 
	from t
) as b
on a.id=b.id and b.rid=1

/*
id         total       kind       theDate
---------- ----------- ---------- ----------
B11        40          梨          2018-03-03
B22        -50         葡萄         2018-03-08
*/

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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