Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL求和_Sql_Sql Server - Fatal编程技术网

T-SQL求和

T-SQL求和,sql,sql-server,Sql,Sql Server,我正在尝试创建包含3列的结果集。来自表A中1列总和但按不同ID分组的每列。下面是我想做的事情的概述 Table A ID Val.1 1 4 1 5 1 6 2 7 2 8 2 9 3 10 3 11 3 12 我想创造一些像 ROW SUM.VAL.1 SUM.VAL.2

我正在尝试创建包含3列的结果集。来自表A中1列总和但按不同ID分组的每列。下面是我想做的事情的概述

Table A
ID       Val.1      
1          4
1          5
1          6
2          7
2          8
2          9
3         10
3         11   
3         12
我想创造一些像

ROW       SUM.VAL.1          SUM.VAL.2         SUM.VAL.3
1            15                 21                33

我知道我不能使用UNION来实现这一点,我正在考虑使用CTE,但对逻辑不太确定。

您需要条件聚合

select 1 as Row,
       sum(case when ID = 1 then Val.1 end),
       sum(case when ID = 2 then Val.1 end),
       sum(case when ID = 3 then Val.1 end)
From yourtable 
如果
ID的数量不是静态的,您可能需要动态交叉表或枢轴

DECLARE @col_list VARCHAR(8000)= Stuff((SELECT ',sum(case when ID = '+ Cast(ID AS VARCHAR(20))+ ' then [Val.1] end) as [val.'+Cast(ID AS VARCHAR(20))+']'
                    FROM   Yourtable
                    GROUP  BY ID
                    FOR xml path('')), 1, 1, ''),
        @sql      VARCHAR(8000) 

exec('select 1 as Row,'+@col_list +'from Yourtable')

您需要条件聚合

select 1 as Row,
       sum(case when ID = 1 then Val.1 end),
       sum(case when ID = 2 then Val.1 end),
       sum(case when ID = 3 then Val.1 end)
From yourtable 
如果
ID的数量不是静态的,您可能需要动态交叉表或枢轴

DECLARE @col_list VARCHAR(8000)= Stuff((SELECT ',sum(case when ID = '+ Cast(ID AS VARCHAR(20))+ ' then [Val.1] end) as [val.'+Cast(ID AS VARCHAR(20))+']'
                    FROM   Yourtable
                    GROUP  BY ID
                    FOR xml path('')), 1, 1, ''),
        @sql      VARCHAR(8000) 

exec('select 1 as Row,'+@col_list +'from Yourtable')

    • 我认为旋转数据表将产生预期的结果

      IF OBJECT_ID('tempdb..#TableA') IS NOT NULL
          DROP TABLE #TableA
      
      CREATE TABLE #TableA
      (
          RowNumber INT, 
          ID INT,
          Value INT
      )
      INSERT #TableA VALUES (1, 1, 4)
      INSERT #TableA VALUES (1, 1, 5)
      INSERT #TableA VALUES (1, 1, 6)
      INSERT #TableA VALUES (1, 2, 7)
      INSERT #TableA VALUES (1, 2, 8)
      INSERT #TableA VALUES (1, 2, 9)
      INSERT #TableA VALUES (1, 3, 10)
      INSERT #TableA VALUES (1, 3, 11)
      INSERT #TableA VALUES (1, 3, 12)
      
      -- https://msdn.microsoft.com/en-us/library/ms177410.aspx
      
      SELECT RowNumber, [1] AS Sum1, [2] AS Sum2, [3] AS Sum3
      FROM 
      (
          SELECT RowNumber, ID, Value 
          FROM #TableA
      ) a
      PIVOT
      (
          SUM(Value)
          FOR ID IN ([1], [2], [3])
      ) AS p
      
      如果您正在寻找的ID是常量,那么这种技术就可以工作,否则我认为如果需要更改ID,一些动态sql也可以工作


      我认为旋转数据表将产生所需的结果

      IF OBJECT_ID('tempdb..#TableA') IS NOT NULL
          DROP TABLE #TableA
      
      CREATE TABLE #TableA
      (
          RowNumber INT, 
          ID INT,
          Value INT
      )
      INSERT #TableA VALUES (1, 1, 4)
      INSERT #TableA VALUES (1, 1, 5)
      INSERT #TableA VALUES (1, 1, 6)
      INSERT #TableA VALUES (1, 2, 7)
      INSERT #TableA VALUES (1, 2, 8)
      INSERT #TableA VALUES (1, 2, 9)
      INSERT #TableA VALUES (1, 3, 10)
      INSERT #TableA VALUES (1, 3, 11)
      INSERT #TableA VALUES (1, 3, 12)
      
      -- https://msdn.microsoft.com/en-us/library/ms177410.aspx
      
      SELECT RowNumber, [1] AS Sum1, [2] AS Sum2, [3] AS Sum3
      FROM 
      (
          SELECT RowNumber, ID, Value 
          FROM #TableA
      ) a
      PIVOT
      (
          SUM(Value)
          FOR ID IN ([1], [2], [3])
      ) AS p
      
      如果您正在寻找的ID是常量,那么这种技术就可以工作,否则我认为如果需要更改ID,一些动态sql也可以工作


      您是否提前知道您将拥有多少不同的ID值,或者这些值是否会有所不同?您可能需要在聚合后使用数据透视@Jerrad ID是静态的。我只有3个不同的ID。您是否提前知道您将拥有多少个不同的ID值,或者会有所不同?您可能需要在聚合后使用数据透视@Jerrad ID是静态的。我只有3个不同的ID。你好@Prdp!你的第一个建议奏效了:)我的ID有一个静态值;数据非常少。非常感谢你!!你好@Prdp!你的第一个建议奏效了:)我的ID有一个静态值;数据非常少。非常感谢你!!