怎么用SQL语句对表【收支表】进行分类汇总?

请问怎么用SQL语句对原表进行分类汇总得到下表的结果

--建立测试表 并插入数据

-- 执行一个查询 ,你可以写在一个存储过程里面,我困了,不过格式按照你说的写好了

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

温馨提示:答案为网友推荐,仅供参考