计算两列之间的总数

Calculate total between two columns

我有 table 名为 #table 和三列。 SinGroup(无所谓,随便什么),Column1,Column2.

    CREATE TABLE #table(
     sinGroup  NVARCHAR(10)
     ,column1 INT
     ,column2 int 
     );

我有一些数据:

    INSERT INTO #table(sinGroup,column1,column2) VALUES
      ('y1',100,0),
      ('y2',0,60),
      ('y3',40,20),
      ('z1',150,0),
      ('z2',0,50),
      ('z3',0,50)

我想知道如何得到这个结果集(c1 - c2 并按 Y 和 Z 分组以及第 1 列下显示的结果):

       SinGroup    C1       C2

         y1        100      0
         y2          0     60
         y3         40     20

          Y         60      0

         z1        150      0
         z2          0     50
         z3          0     50

          Z         50      0

还有这样的结果(c1-c2 和每行 grop,结果显示在第 1 列下)

       SinGroup     C1      C2
          y1       100      0
          y1       100      0

          y2         0     60
          y2       -60      0

          y3        40     20
          y3        20      0

          z1       150      0
          z1       150      0

          z2         0     50
          z2       -50      0

          z3         0     50
          z3        -50     0

sqlFiddle

编辑: 我试过这样的东西,但我不想要 4 列,结果必须低于 c1。

       select sinGroup, column1, column2, sum(column1) - sum(column2) as c
       from #table
       group by sinGroup,column1,column2

如果可能,请在前端格式化这些数据。 SQL 不是为此类任务设计的语言。

查询 1 SQL Fiddle

WITH summary AS (
  SELECT LEFT(sinGroup,1) AS sinGroup, SUM(C1) - SUM(c2) AS total 
  FROM t1
  GROUP BY LEFT(sinGroup,1)
)
SELECT sinGroup,c1,c2
FROM 
(  SELECT sinGroup,c1,c2, 0 as display_order
  FROM t1
  UNION ALL
  SELECT sinGroup
    ,CASE WHEN total > 0 THEN total ELSE 0 END AS C1
    ,CASE WHEN total < 0 THEN total ELSE 0 END AS C2
    ,1 AS display_order
  FROM summary
 ) t
 ORDER BY LEFT(sinGroup,1),display_order,sinGroup 

查询 2 SQL Fiddle

SELECT sinGroup,c1,c2
FROM 
(  SELECT sinGroup,c1,c2, 0 as display_order
  FROM t1
  UNION ALL
  SELECT sinGroup, SUM(C1) - SUM(C2) AS c1, 0 AS C2, 1  as display_order
  FROM t1
  GROUP BY sinGroup
 ) t
 ORDER BY sinGroup,display_order