【问题标题】:Aggregation and duplicated line with a left join T-SQL带有左连接 T-SQL 的聚合和重复行
【发布时间】:2017-06-30 09:14:48
【问题描述】:

我有基于SQL script (SQL Fiddle)的数据,你可以在下面看到


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Id | Emitter    |   EmitterIBAN                         |  Receiver    |   ReceiverIBAN                           |         Adresss                          |     Value 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1,   Ernst,         HR53 8827 2118 4692 8207 5,           Kimbra,         CH20 1042 6T0N MDTG JT47 U,                     3256 Arrowood Point         0002,        121.72
2,   Keene,         SK81 1004 7484 7505 6308 9259,        Torrance,       RO23 ZWTR OJKK VAU9 T5P4 2GDY,                  35197 Green Ridge Way,                   82.52
3,   Ernst,         HR53 8827 2118 4692 8207 5,           Kimbra,         CH20 1042 6T0N MDTG JT47 U,                     3256 Arrowood Point         0048,        51.81
4,   Korie,         ME43 9833 9830 7367 4239 60,Roy,      IL69            9686 1536 8102 2219 165,                        5 Swallow Alley,                         88.01
5,   Ernst,         HR53 8827 2118 4692 8207 5,           Kimbra,         CH20 1042 6T0N MDTG JT47 U,                     3256 Arrowood Point         0001,        133.99
6,   Charmine,      BG92 TOXX 8380 785I JKRQ JS,          Sarette,        MU67 RYRU 9293 5875 6859 7111 075X HR,          8 Sage Place,                            36.30
7,   Ernst,         HR53 8827 2118 4692 8207 5,           Kimbra,         CH20 1042 6T0N MDTG JT47 U,                     3256 Arrowood Point         0004,        186.99

我想在下面得到这样的结果

  • 计算一对EmitterIBANReceiverIBAN进行的操作次数
  • 计算每对 EmitterIBANReceiverIBAN 的总和值

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NumberOperation | Emitter    |   EmitterIBAN                         |  Receiver    |   ReceiverIBAN                           |         Adresss                          |     SumValue 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4,                Ernst,         HR53 8827 2118 4692 8207 5,           Kimbra,         CH20 1042 6T0N MDTG JT47 U,                     3256 Arrowood Point           0002,      494,51
1,                Keene,         SK81 1004 7484 7505 6308 9259,        Torrance,       RO23 ZWTR OJKK VAU9 T5P4 2GDY,                  35197 Green Ridge Way,                   82.52
1,                Korie,         ME43 9833 9830 7367 4239 60,Roy,      IL69            9686 1536 8102 2219 165,                        5 Swallow Alley,                         88.01
1,                Charmine,      BG92 TOXX 8380 785I JKRQ JS,          Sarette,        MU67 RYRU 9293 5875 6859 7111 075X HR,          8 Sage Place,                            36.30

我做了一个选择,它给了我夫妻的数量和总和值,就像Query Result (SQL Fiddle)


SELECT Count(1)     AS NumberOperation, 
       emitteriban, 
       receiveriban, 
       Sum([value]) AS SumValues 
FROM   tableesperadocetransaction 
GROUP  BY emitteriban, 
          receiveriban 

我需要将名称和地址添加到结果中,所以我尝试像下面的请求一样进行左连接,我得到了这个Result (SQL Fiddle)


SELECT * 
FROM   (SELECT Count(1)     AS NumberOperation, 
               emitteriban  AS _EmitterIban, 
               receiveriban AS _ReceiverIban, 
               Sum([value]) AS SumValues 
        FROM   tableesperadocetransaction 
        GROUP  BY emitteriban, 
                  receiveriban) tmp_T 
       LEFT JOIN tableesperadocetransaction 
              ON tableesperadocetransaction.emitteriban = tmp_T._emitteriban 
                 AND tableesperadocetransaction.receiveriban = 
                     tmp_T._receiveriban  

那么我怎样才能更正我的请求以获得我之前显示的结果。

PS : Group By Name, Address 在我的情况下不起作用,因为我的夫妇没有某些地址

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您可以将 Emitter 和 Address 列添加到第一个 select 语句(以及在 GROUP BY 部分):

    select  count(1) as NumberOperation, 
    Emitter, 
    ReceiverAddress,
    EmitterIban, 
    ReceiverIban,
    SUM([Value]) as SumValues
    FROM TableEsperadoceTransaction
    Group By EmitterIban,
             ReceiverIban, 
             Emitter,
             ReceiverAddress
    

    【讨论】:

    • 如果每个组只需要一个地址,那么一个简单的解决方法是 SELECT MAX(address) 而不是 GROUP BY address
    • 我有 1.45 亿条记录,你能告诉我最好的解决方案是你的还是@Tien Nguyen 给出的解决方案
    • 我的解决方案应该更快
    【解决方案2】:

    你只加DISTINCT

    SELECT DISTINCT *
    FROM   (SELECT Count(1)     AS NumberOperation, 
                   emitteriban  AS _EmitterIban, 
                   receiveriban AS _ReceiverIban, 
                   Sum([value]) AS SumValues 
            FROM   tableesperadocetransaction 
            GROUP  BY emitteriban, 
                      receiveriban) tmp_T 
           LEFT JOIN tableesperadocetransaction 
                  ON tableesperadocetransaction.emitteriban = tmp_T._emitteriban 
                     AND tableesperadocetransaction.receiveriban = 
                         tmp_T._receiveriban  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2014-08-30
      相关资源
      最近更新 更多