--建立测试表 并插入数据
-- 执行一个查询 ,你可以写在一个存储过程里面,我困了,不过格式按照你说的写好了
CREATE TABLE TB
(说明 NVARCHAR(20)
,
类别 NVARCHAR(20),
金额 INT ,
款项类别 NVARCHAR(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目A', -- 说明 - nvarchar(20)
N'支出', -- 类别 - nvarchar(20)
900, -- 金额 - int
N'费用B' -- 款项类别 - nvarchar(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目A', -- 说明 - nvarchar(20)
N'收入', -- 类别 - nvarchar(20)
2000, -- 金额 - int
N'收入A' -- 款项类别 - nvarchar(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目B', -- 说明 - nvarchar(20)
N'支出', -- 类别 - nvarchar(20)
3500, -- 金额 - int
N'费用C' -- 款项类别 - nvarchar(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目C', -- 说明 - nvarchar(20)
N'支出', -- 类别 - nvarchar(20)
200, -- 金额 - int
N'费用D' -- 款项类别 - nvarchar(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目A', -- 说明 - nvarchar(20)
N'支出', -- 类别 - nvarchar(20)
300, -- 金额 - int
N'费用A' -- 款项类别 - nvarchar(20)
)
CREATE TABLE #temp
(
说明 NVARCHAR(20) ,
类别 NVARCHAR(20) ,
金额 INT ,
款项类别 NVARCHAR(20)
)
INSERT INTO #temp
SELECT *
FROM dbo.TB
UNION ALL
SELECT 说明 ,
CASE WHEN 说明 IS NOT NULL THEN ISNULL(类别, '收支净值')
ELSE 类别
END + '合计' AS 类别 ,
SUM(CASE WHEN 类别 = '收入' THEN 金额
ELSE -金额
END) AS 金额 ,
MAX(款项类别) AS 款项类别
FROM TB
WHERE 说明 IS NOT NULL
GROUP BY ROLLUP(说明, 类别)
ORDER BY 说明
INSERT #temp
SELECT B.*
FROM ( SELECT DISTINCT
说明 ,
'收入合计' AS 类别 ,
0 AS 金额 ,
'' AS 款项类别
FROM #temp
WHERE 说明 IS NOT NULL
) B
WHERE B.说明 + B.类别 NOT IN ( SELECT 说明 + 类别
FROM #temp
WHERE 说明 IS NOT NULL )
INSERT #temp
SELECT B.*
FROM ( SELECT DISTINCT
说明 ,
'支出合计' AS 类别 ,
0 AS 金额 ,
'' AS 款项类别
FROM #temp
WHERE 说明 IS NOT NULL
) B
WHERE B.说明 + B.类别 NOT IN ( SELECT 说明 + 类别
FROM #temp
WHERE 说明 IS NOT NULL );
WITH tt
AS ( SELECT 说明 ,
类别 ,
CASE WHEN 类别 = '支出合计' THEN ABS(金额)
ELSE 金额
END AS 金额 ,
CASE WHEN 类别 = '收入'
OR 类别 = '支出' THEN 款项类别
ELSE ''
END AS 款项类别 ,
CASE WHEN 类别 = '支出' THEN 1
WHEN 类别 = '收入' THEN 2
WHEN 类别 = '收入合计' THEN 3
WHEN 类别 = '支出合计' THEN 4
WHEN 类别 = '收支净值合计' THEN 5
ELSE 6
END AS num
FROM #temp
WHERE 说明 IS NOT NULL
)
SELECT tt.说明 ,
tt.类别 ,
tt.金额 ,
tt.款项类别
FROM tt
ORDER BY 说明 ,
num
DROP TABLE #temp