【问题标题】:How to merge two group by queries from the same table?如何合并来自同一个表的两个分组查询?
【发布时间】:2020-10-12 14:39:12
【问题描述】:

我需要将同一张表中的两个查询合并到一张表中:

SELECT
   
       t.[Origin Terminal Name] as 'Terminal',

       COUNT(t.[Pro Number]) as 'Inbound Shipments',
    
       SUM(t.[Total Revenue]) as 'Inbound Revenue'
     
  FROM [AX2cTestStage].[dbo].[AX2cTestAdapter_dbo_AAATRANSPORTTABLE_V] t

  GROUP BY t.[Origin Terminal Name]

  ORDER BY t.[Origin Terminal Name] ASC


  SELECT
   
       t.[Destination Terminal Name] as 'Terminal',

       COUNT(t.[Pro Number]) as 'Outbound Shipments',
    
       SUM(t.[Total Revenue]) as 'Outbound Revenue'
     
  FROM [AX2cTestStage].[dbo].[AX2cTestAdapter_dbo_AAATRANSPORTTABLE_V] t

  GROUP BY t.[Destination Terminal Name]

  ORDER BY t.[Destination Terminal Name] ASC

它们都产生以下结果:

Terminal    Inbound Shipments   Inbound Revenue
Abilene            520             75970.08
Albany             877            130560.28

Terminal    Outbound Shipments  Outbound Revenue
Abilene             2684           419523.83
Albany              2820           407871.89

我需要这个作为输出:

Terminal    Inbound Shipments  Inbound Revenue  Outbound Shipments  Outbound Revenue
Abilene            520              75970.08           2684              419523.83
Albany             877              130560.28          2820              407871.89

我试过这个查询:

 SELECT 
   
       t.[Origin Terminal Name] as 'Terminal',

       COUNT(t.[Pro Number]) as 'Inbound Shipments',
    
       SUM(t.[Total Revenue]) as 'Inbound Revenue',

            (SELECT
   
            t2.[Destination Terminal Name] as 'Terminal',

            COUNT(t2.[Pro Number]) as 'Outbound Shipments',
    
            SUM(t2.[Total Revenue]) as 'Outbound Revenue'
     
            FROM [AX2cTestStage].[dbo].[AX2cTestAdapter_dbo_AAATRANSPORTTABLE_V] t2

            GROUP BY t2.[Destination Terminal Name])
     
  FROM [AX2cTestStage].[dbo].[AX2cTestAdapter_dbo_AAATRANSPORTTABLE_V] t

  LEFT JOIN [AX2cTestStage].[dbo].[AX2cTestAdapter_dbo_AAATRANSPORTTABLE_V] t2 ON t.[Origin Terminal Name] = t2.[Destination Terminal Name]

  GROUP BY t.[Origin Terminal Name]

  ORDER BY t.[Origin Terminal Name] ASC

我收到了这个错误:

消息 116,级别 16,状态 1,行 22 当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。

子查询是解决这个问题的方法吗?我很感激任何建议

【问题讨论】:

  • 请发布一些示例数据。您可以尝试为入站和出站分别使用一个临时表加入最终数据集的结果集。

标签: sql sql-server tsql ssms unpivot


【解决方案1】:

如果我没看错,您可以使用cross apply 将列取消转为行,然后进行聚合:

SELECT
    x.terminal,
    SUM(CASE WHEN x.which = 'inbound'  THEN 1 ELSE 0 END) as inbound_shipments,
    SUM(CASE WHEN x.which = 'inbound'  THEN x.total_revenue ELSE 0 END) as inbound_revenue,
    SUM(CASE WHEN x.which = 'outbound' THEN 1 ELSE 0 END) as outbound_shipments,
    SUM(CASE WHEN x.which = 'outbound' THEN x.total_revenue ELSE 0 END) as outbound_revenue 
FROM [AX2cTestStage].[dbo].[AX2cTestAdapter_dbo_AAATRANSPORTTABLE_V] t
CROSS APPLY (VALUES 
    ('inbound',  [Origin Terminal Name],      [Total Revenue]),
    ('outbound', [Destination Terminal Name], [Total Revenue])
) AS x(which, is_destination, terminal, total_revenue)
GROUP BY x.terminal
ORDER BY x.terminal

【讨论】:

    【解决方案2】:
    SELECT
       
           t.[Origin Terminal Name] as 'Terminal',
    
           COUNT(t.[Pro Number]) as 'Inbound Shipments',
        
           SUM(t.[Total Revenue]) as 'Inbound Revenue',
    
           max(t2.[Outbound Shipments]) as 'Outbound Shipments',
    
           max(t2.[Outbound Revenue]) as 'Outbound Revenue'
    
         
      FROM [AX2cTestStage].[dbo].[AX2cTestAdapter_dbo_AAATRANSPORTTABLE_V] t
    
      INNER JOIN  (SELECT
       
           t2.[Destination Terminal Name] as 'Terminal',
    
           COUNT(t2.[Pro Number]) as 'Outbound Shipments',
        
           SUM(t2.[Total Revenue]) as 'Outbound Revenue'
         
      FROM [AX2cTestStage].[dbo].[AX2cTestAdapter_dbo_AAATRANSPORTTABLE_V] t2
    
      GROUP BY t2.[Destination Terminal Name]) t2 on t.[Origin Terminal Name] = t2.Terminal
    
      GROUP BY t.[Origin Terminal Name]
    
      ORDER BY t.[Origin Terminal Name] ASC
    

    【讨论】:

    • 我只需要将子查询添加到连接语句中。这虽然有效
    猜你喜欢
    • 2013-11-22
    • 2016-11-10
    • 1970-01-01
    • 2012-02-18
    • 2020-02-19
    • 1970-01-01
    • 2020-01-10
    • 2018-09-21
    • 2011-06-02
    相关资源
    最近更新 更多