一条每2行汇总的SQL题目
这里就原问题及参考答案列出如下:
/*
编号 金额
-------------------
100101 12.0000
100102 20.0000
100103 23.0000
100104 55.0000
100105 77.0000
100106 33.0000
100107 67.0000
100109 23.0000
100110 43.0000
要求结果是
按第1、2行,第3、4行、第5、6行
汇总
no account
------------------------
100101--100102 32
100103--100104 78
100105--100106 110
100107--100109 90
100110-- 43
--------------------------------------------------
以列id为标识列
要是表中没有标识列ID,或者标识列ID存在断缺行,需要新建立一个临时表,增加一新的标识列.
基本的计算方法如下:
*/
CREATE TABLE #T(id int IDENTITY(1,1),No nvarchar(20),account money)
INSERT INTO #T
SELECT '100101',12 UNION ALL
SELECT '100102',20 UNION ALL
SELECT '100103',23 UNION ALL
SELECT '100104',55 UNION ALL
SELECT '100105',77 UNION ALL
SELECT '100106',33 UNION ALL
SELECT '100107',67 UNION ALL
SELECT '100109',23 UNION ALL
SELECT '100110',43
SELECT ISNULL(Y.no,'')+'--'+ISNULL(Z.no,'') AS no,X.account FROM
(SELECT CASE WHEN (1&A.id)=1 THEN A.id ELSE B.id END AS id,SUM(A.account) AS account
FROM #T A LEFT OUTER JOIN #T B ON B.id+1=A.id
GROUP BY CASE WHEN (1&A.id)=1 THEN A.id ELSE B.id END
) X LEFT OUTER JOIN #T Y ON Y.id=X.id
LEFT OUTER JOIN #T Z ON Z.id=X.id+1
/*
汇总的关键主要是中间的子SELECT语句
SELECT CASE WHEN (1&A.id)=1 THEN A.id ELSE B.id END AS id,SUM(A.account) AS account
FROM #T A LEFT OUTER JOIN #T B ON B.id+1=A.id
GROUP BY CASE WHEN (1&A.id)=1 THEN A.id ELSE B.id END
*/
/*
no account
------------------------
100101--100102 32.0000 --第1-2行合计
100103--100104 78.0000 --第3-4行合计
100105--100106 110.0000 --第5-6行合计
100107--100109 90.0000 --第7-8行合计
100110-- 43.0000 --第9-10行合计
*/
DROP TABLE #T
编号 金额
-------------------
100101 12.0000
100102 20.0000
100103 23.0000
100104 55.0000
100105 77.0000
100106 33.0000
100107 67.0000
100109 23.0000
100110 43.0000
要求结果是
按第1、2行,第3、4行、第5、6行
![](https://www.cnblogs.com/Images/dot.gif)
no account
------------------------
100101--100102 32
100103--100104 78
100105--100106 110
100107--100109 90
100110-- 43
--------------------------------------------------
以列id为标识列
要是表中没有标识列ID,或者标识列ID存在断缺行,需要新建立一个临时表,增加一新的标识列.
基本的计算方法如下:
*/
CREATE TABLE #T(id int IDENTITY(1,1),No nvarchar(20),account money)
INSERT INTO #T
SELECT '100101',12 UNION ALL
SELECT '100102',20 UNION ALL
SELECT '100103',23 UNION ALL
SELECT '100104',55 UNION ALL
SELECT '100105',77 UNION ALL
SELECT '100106',33 UNION ALL
SELECT '100107',67 UNION ALL
SELECT '100109',23 UNION ALL
SELECT '100110',43
SELECT ISNULL(Y.no,'')+'--'+ISNULL(Z.no,'') AS no,X.account FROM
(SELECT CASE WHEN (1&A.id)=1 THEN A.id ELSE B.id END AS id,SUM(A.account) AS account
FROM #T A LEFT OUTER JOIN #T B ON B.id+1=A.id
GROUP BY CASE WHEN (1&A.id)=1 THEN A.id ELSE B.id END
) X LEFT OUTER JOIN #T Y ON Y.id=X.id
LEFT OUTER JOIN #T Z ON Z.id=X.id+1
/*
汇总的关键主要是中间的子SELECT语句
SELECT CASE WHEN (1&A.id)=1 THEN A.id ELSE B.id END AS id,SUM(A.account) AS account
FROM #T A LEFT OUTER JOIN #T B ON B.id+1=A.id
GROUP BY CASE WHEN (1&A.id)=1 THEN A.id ELSE B.id END
*/
/*
no account
------------------------
100101--100102 32.0000 --第1-2行合计
100103--100104 78.0000 --第3-4行合计
100105--100106 110.0000 --第5-6行合计
100107--100109 90.0000 --第7-8行合计
100110-- 43.0000 --第9-10行合计
*/
DROP TABLE #T