Sql分组与排序的问题
ID (varchar) Time(DateTime) A(int) B(int)
1 2012-1-1 12:12:12 3 5
1 2012-1-1 1:1:1 5 6
2 2012-1-2 12:1:1 2 6
要求按“Time”和"ID"分组,选出一个“Time”段内,最大时的A和B的和。例如,求出每一个ID在每一天中,“Time”最大时的A,和每一个ID每一天中B的和。 用SQL或者存储过程都可以,该怎么写呢? 展开
你的问题有问题:
选出一个“Time”段内,最大时的A和B的和,,,的意思是: 如id为1,今天最大time为12:12:12,,,,然后算出这个时间点的A+B的值,,,,是这个意思吗?
求出每一个ID在每一天中,“Time”最大时的A,和每一个ID每一天中B的和,,,,
的意思是:如ID为1在这一天中,“Time”最大时的A,“time最大时”B的和,,,也就是说,和1的意思一样
还有另外的意思是:如ID为1在这一天中,“Time”最大时的A + (一整天B的和)???
我是理解出了这几个意思,所以不知道怎么去处理,你最好再看看你的问题,意思表述的明确点。
先按Time分组,一天是一组,然后找出这一天内的记录中:①Time最大时的A,②B的和
SELECT A.ID,A.MAX_TIME,A.MAX_A,(SELECT SUM(B) FROM TEST_CWJ AB WHERE AB.ID = A.ID)
FROM
(select ID,max(TIME)MAX_TIME,MAX(A)MAX_A from TEST_CWJ group by ID)A
我测试的表结构
ID TIME A B
1 2013/7/2 10:28:37 3 5
1 2013/7/2 10:28:47 5 6
2 2013/7/3 10:28:56 2 6
测试的结果
ID MAX_TIME MAX_A SUM_B
1 2013/7/2 10:28:47 5 11
2 2013/7/3 10:28:56 2 6
我可能表达的不够清楚。我的意思是:先按Time和ID分组,得到了每一个ID每一天的记录。然后计算这些组记录中,①时间最大时的A;②所有B的和。
例如ID是"1"的记录有两条,然后得到的是这两天记录中,Time较大时的A;两条记录中B的和。所以结果是1 2012-1-1 12:12:12 3 11
这个貌似有点烦了,直接查询的话语句会比较长了,用变量可能要简单点
试一下以下语句
SELECT ID,Time,MAX(A),SUM(B) FROM 表名 GROUP BY ID,Time
不是MAX(A),是Time最大时的A
多插了几条数据测试﹐写的比较乱﹐你放查询分析器里试运行下
思路是先把日期与时间分组﹐然后再把A与B分开查询﹐然后再合并
DECLARE @TB TABLE(ID VARCHAR(10),TIME DATETIME,A INT,B INT)
DECLARE @TB2 TABLE(ID VARCHAR(10),TIME1 VARCHAR(20),TIME2 TIME,A INT,B INT)
INSERT INTO @TB VALUES('1','2012-1-1 12:12:12',3,5)
INSERT INTO @TB VALUES('1','2012-1-1 1:1:1',5,6)
INSERT INTO @TB VALUES('2','2012-1-2 12:1:1',2,6)
INSERT INTO @TB VALUES('2','2012-1-2 12:12:1',3,6)
INSERT INTO @TB VALUES('2','2012-1-2 13:12:1',4,6)
INSERT INTO @TB2 SELECT ID,CONVERT(VARCHAR,TIME,111) AS TIME1 ,CONVERT(TIME,TIME,108) AS TIME2 ,A,B FROM @TB
SELECT A.ID,
A.TIME1 AS DATE,
A.T2 AS TIME,
C.A AS A,
B.B AS B
FROM
(SELECT ID,TIME1,MAX(TIME2)AS T2 FROM @TB2 GROUP BY ID,TIME1) AS A
LEFT JOIN (SELECT ID,TIME1,SUM(B) AS B FROM @TB2 GROUP BY ID,TIME1) AS B
ON A.ID=B.ID AND A.TIME1=B.TIME1
LEFT JOIN @TB2 C
ON A.ID=C.ID AND A.TIME1=C.TIME1 AND A.T2=C.TIME2
效果如下