明细+合计 的SQL语句如何写?
下面的SQL如何实现:
(原数据:)
水表编号 月 取整金额
100100 1201 20
100101 1201 5
100101 1202 8
100102 1201 10
100103 1201 5
100103 1202 6
100103 1203 5
(通过用select语句变成:)
100100 1201 20
合计 1月 20
100101 1201 5
1202 8
合计 2月 13
100102 1201 10
合计 1月 10
100103 1201 5
1202 6
1203 5
合计 3月 11
要用这种查询结果做到报表中。
[解决办法]
GOIF OBJECT_ID('tb1') IS NOT null DROP TABLE tb1goCREATE TABLE tb1( 水表编号 VARCHAR(10), 月 VARCHAR(10),取整金额 int)INSERT INTO tb1 SELECT '100100', '1201', 20 UNION ALLSELECT '100101', '1201', 5 UNION ALLSELECT '100101', '1202', 8 UNION ALLSELECT '100102', '1201', 10 UNION ALLSELECT '100103', '1201', 5 UNION ALLSELECT '100103', '1202', 6 UNION ALLSELECT '100103', '1203', 5;WITH c1 AS( SELECT 水表编号,月,取整金额 FROM tb1),c2 AS ( SELECT 合计=水表编号+N'合计:',col2=RIGHT(max_month,2)+N'月', sum_money FROM ( SELECT 水表编号,MAX(月) AS max_month,SUM(取整金额) AS sum_money FROM tb1 GROUP BY 水表编号 ) AS t )SELECT * FROM ( SELECT 水表编号,月,取整金额 FROM c1 UNION ALL SELECT 合计,col2,sum_money FROM c2) AS t ORDER BY 水表编号,月,取整金额/*水表编号 月 取整金额------------- ---------- -----------100100 1201 20100100合计: 01月 20100101 1201 5100101 1202 8100101合计: 02月 13100102 1201 10100102合计: 01月 10100103 1201 5100103 1202 6100103 1203 5100103合计: 03月 16(11 行受影响)*/
[解决办法]
if object_id('[tb]') is not null drop table [tb]gocreate table [tb]([水表编号] int,[月] int,[取整金额] int)insert [tb]select 100100,1201,20 union allselect 100101,1201,5 union allselect 100101,1202,8 union allselect 100102,1201,10 union allselect 100103,1201,5 union allselect 100103,1202,6 union allselect 100103,1203,5goSELECT 水表编号,月,取整金额FROM(SELECT 水表编号 AS PX,CASE WHEN RN=1 THEN LTRIM(水表编号) ELSE '' END AS 水表编号,LTRIM(月) AS 月,取整金额 FROM (SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY 水表编号 ORDER BY 月) FROM TB) AUNION ALLSELECT 水表编号,'合计',LTRIM(COUNT(1))+'月',SUM(取整金额) AS 取整金额FROM TBGROUP BY 水表编号) TORDER BY PX,LEN(月) desc,月/**水表编号 月 取整金额------------ -------------- -----------100100 1201 20合计 1月 20100101 1201 5 1202 8合计 2月 13100102 1201 10合计 1月 10100103 1201 5 1202 6 1203 5合计 3月 16(11 行受影响)**/
[解决办法]
Select T.[水表编号] ,
Case When isNull(T.[月],'') = '' Then '合计' Else Cast(T.[月] As Varchar(10)) End As [月],
T.[取整金额]
From (Select [水表编号] ,[月] ,Sum([取整金额]) [取整金额]
From @Tb
Group By [水表编号] ,[月] With Cube
) T
Where isNull([水表编号],'') <> '' Or (isNull([水表编号],'')+isNull([月],'') = '')
[解决办法]
Declare @Tb table ([水表编号] int,[月] int,[取整金额] int)insert Into @Tbselect 100100,1201,20 union allselect 100101,1201,5 union allselect 100101,1202,8 union allselect 100102,1201,10 union allselect 100103,1201,5 union allselect 100103,1202,6 union allselect 100103,1203,5Select T.[水表编号] ,Case When isNull(T.[月],'') = '' Then '合计' Else Cast(T.[月] As Varchar(10)) End As [月], T.[取整金额]From (Select [水表编号] ,[月] ,Sum([取整金额]) [取整金额]From @TbGroup By [水表编号] ,[月] With Cube) TWhere isNull([水表编号],'') <> '' Or (isNull([水表编号],'')+isNull([月],'') = '')