多个SQL SELECT语句的聚合

多个SQL SELECT语句的聚合,sql,sql-server,Sql,Sql Server,我有一张表表1如下: |--------------|--------------|--------------| | POS | TYPE | VOLUME | |--------------|--------------|--------------| | 1 | A | 34 | | 2 | A | 2 | |

我有一张表
表1
如下:

|--------------|--------------|--------------|
|      POS     |     TYPE     |    VOLUME    |
|--------------|--------------|--------------|
|       1      |      A       |     34       |
|       2      |      A       |     2        |
|       1      |      A       |     12       |
|       3      |      B       |     200      |
|       4      |      C       |     1        |
|--------------|--------------|--------------|
我想得到这样的东西(
表2
):

到目前为止,我的代码是:

SELECT
    (SELECT COUNT(TYPE)
    FROM TABLE1
    WHERE TYPE = 'A') AS [Amount_A]
    ,(SELECT COUNT(TYPE)
    FROM TABLE1
    WHERE TYPE = 'B') AS [Amount_B]
    ,(SELECT COUNT(TYPE)
    FROM TABLE1
    WHERE TYPE = 'C') AS [Amount_C]
    ,(SELECT SUM(VOLUME)
    FROM TABLE AS [Sum_Volume]
INTO [TABLE2]
现在有两个问题:

  • 我如何将有关
    POS
    的区别包括在内
  • 是否有更好的方法来计算每个
    类型

  • 我正在使用MSSQLServer。

    您的第一列应该是POS,您将按POS分组

    这将为每个POS值提供一行,并相应地聚合(计数和求和)

    您还可以使用CASE语句而不是subselect。例如,而不是:

     (SELECT COUNT(TYPE)
         FROM TABLE1
         WHERE TYPE = 'A') AS [Amount_A]
    
    使用:


    您的第一列应该是POS,您将按POS分组

    这将为每个POS值提供一行,并相应地聚合(计数和求和)

    您还可以使用CASE语句而不是subselect。例如,而不是:

     (SELECT COUNT(TYPE)
         FROM TABLE1
         WHERE TYPE = 'A') AS [Amount_A]
    
    使用:


    您需要的是使用
    分组依据
    ,以及聚合函数。因此,这导致:

    USE Sandbox;
    GO
    
    CREATE TABLE Table1 (Pos tinyint, [Type] char(1), Volume smallint);
    INSERT INTO Table1
    VALUES (1,'A',34 ),
           (2,'A',2  ),
           (1,'A',12 ),
           (3,'B',200),
           (4,'C',1  );
    
    GO
    
    SELECT Pos,
           COUNT(CASE WHEN [Type] = 'A' THEN [Type] END) AS Amount_A,
           COUNT(CASE WHEN [Type] = 'B' THEN [Type] END) AS Amount_B,
           COUNT(CASE WHEN [Type] = 'C' THEN [Type] END) AS Amount_C,
           SUM(Volume) As Sum_Volume
    FROM Table1 T1
    GROUP BY Pos;
    
    DROP TABLE Table1;
    GO
    

    如果
    [Type]
    有一个未定义的变量值,那么您很可能需要使用动态SQL。

    您要寻找的是使用
    分组依据以及聚合函数。因此,这导致:

    USE Sandbox;
    GO
    
    CREATE TABLE Table1 (Pos tinyint, [Type] char(1), Volume smallint);
    INSERT INTO Table1
    VALUES (1,'A',34 ),
           (2,'A',2  ),
           (1,'A',12 ),
           (3,'B',200),
           (4,'C',1  );
    
    GO
    
    SELECT Pos,
           COUNT(CASE WHEN [Type] = 'A' THEN [Type] END) AS Amount_A,
           COUNT(CASE WHEN [Type] = 'B' THEN [Type] END) AS Amount_B,
           COUNT(CASE WHEN [Type] = 'C' THEN [Type] END) AS Amount_C,
           SUM(Volume) As Sum_Volume
    FROM Table1 T1
    GROUP BY Pos;
    
    DROP TABLE Table1;
    GO
    

    如果您的
    [Type]
    有一个未定义的变量值,那么您很可能需要使用动态SQL。

    了解Pivot。了解Pivot。这是一个比我更全面的答案。这是一个比我更全面的答案。向上投票。