如何从多个聚合表中检索数据?

Posted

技术标签:

【中文标题】如何从多个聚合表中检索数据?【英文标题】:How do I retrieve data from multiple aggregation tables? 【发布时间】:2017-07-15 17:00:08 【问题描述】:

我有 3 个付款方式表(信用卡 -SADAD-at_place)。

我从所有这些中检索数据,然后使用 Sum 对所有的价格求和

select Payment_Date, count(Payment_Date) as Transaction_COUNT, sum(OWNER_Amount) as OWNER_Amount  , sum (commission) as commission,sum(Total_Amount) As Sub_total
  from (
select format(PAYMENT_POOL_CREDIT.PAYMENT_POOL_CREDIT_DATE,'dd/MM/yyyy') as Payment_Date,PAYMENT_POOL_CREDIT.PAYMENT_POOL_CREDIT_OWNER_MONEY as OWNER_Amount,PAYMENT_POOL_CREDIT.PAYMENT_POOL_CREDIT_TAX_MONEY as commission, PAYMENT_POOL_CREDIT.PAYMENT_POOL_CREDIT_OWNER_MONEY+PAYMENT_POOL_CREDIT.PAYMENT_POOL_CREDIT_TAX_MONEY as Total_Amount from PAYMENT_POOL_CREDIT
union  all
select format(PAYMENT_POOL_SADAD.PAYMENT_POOL_SADAD_DATE,'dd/MM/yyyy') as Payment_Date,PAYMENT_POOL_SADAD.PAYMENT_POOL_SADAD_OWNER_MONEY as OWNER_Amount,PAYMENT_POOL_SADAD.PAYMENT_POOL_SADAD_TAX_MONEY as commission ,PAYMENT_POOL_SADAD.PAYMENT_POOL_SADAD_OWNER_MONEY+PAYMENT_POOL_SADAD.PAYMENT_POOL_SADAD_TAX_MONEY as Total_Amount  from PAYMENT_POOL_SADAD
union all 
select format(PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_DATE,'dd/MM/yyyy') as Payment_Date,PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_OWNER_MONEY as OWNER_Amount,PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_TAX_MONEY as commission,PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_OWNER_MONEY+PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_TAX_MONEY  as Total_Amount from PAYMENT_POOL_AT_PLACE
 ) as t

group by Payment_Date

现在我想要将另一个聚合列加入到上一个查询中 从这个聚合。

select format(PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_DATE,'dd/MM/yyyy') as Payment_Date, sum(PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_OWNER_MONEY+PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_TAX_MONEY)  as Total_Amount_At_Place from PAYMENT_POOL_AT_PLACE
    group by  format(PAYMENT_POOL_AT_PLACE.PAYMENT_POOL_AT_PLACE_DATE,'dd/MM/yyyy') 

谁能帮忙?

这是示例表

PAYMENT_POOL_CREDIT

Payment_Date | OWNER_Amount  |  commission | Total_Amount 
11/02/2017   |    500.00     |    40.00    |    540.00
15/05/2016   |    242.00     |    10.00    |    252.00
11/02/2017   |    100.00     |    30.00    |    130.00
15/05/2016   |    620.00     |    60.00    |    680.00

PAYMENT_POOL_SADAD

Payment_Date | OWNER_Amount  |  commission | Total_Amount 
05/05/2016   |    5000.00    |  200.00     |    5200.00
11/02/2017   |    242.00     |    10.00    |    252.00
15/05/2016   |    430.00     |    30.00    |    460.00
11/02/2017   |    310.00     |    60.00    |    370.00
15/05/2016   |    220.00     |    60.00    |    280.00

PAYMENT_POOL_AT_PLACE

Payment_Date | OWNER_Amount  |  commission | Total_Amount 
17/06/2016   |    2000.00    |  300.00     |    2300.00
15/05/2016   |    500.00     |   200.00    |    700.00
22/06/2016   |    500        |    300.00   |    800.00
17/06/2016   |    2000.00    |    300.00   |    2300.00
15/05/2016   |    500.00     |    200.00   |    700.00

我要找的结果是这样的

Payment_Date |  Transaction_COUNT  | OWNER_Amount  | Total_commission  |  Total_Amount  |  Total_at_palce
05/05/2016   |      1              |    5000.00    |    200.00         |    5200.00     |  NULL
11/02/2017   |      4              |    1052.00    |    140.00         |    1192.00     |  NULL
15/05/2016   |      6              |    2512.00    |    590.00         |    3102.00     |  1400
22/06/2016   |      1              |    500.00     |    300.00         |    800.00      |  800

【问题讨论】:

【参考方案1】:

您可以向union all 派生表添加一列来区分来源,而不是加入这些查询,因此您可以使用条件聚合来分别从payment_pool_at_place 获取total_amount,如下所示:

select Payment_Date
  , count(Payment_Date) as Transaction_count
  , sum(owner_Amount) as owner_Amount
  , sum(commission) as commission
  , sum(Total_Amount) as Sub_total
  , sum(case when src = 'ppap' then Total_Amount_At_Place end) as Total_Amount_At_Place
from (
   select format(ppc.payment_pool_credit_date, 'dd/mm/yyyy') as Payment_Date
    , ppc.payment_pool_credit_owner_money as owner_Amount
    , ppc.payment_pool_credit_tax_money as commission
    , ppc.payment_pool_credit_owner_money 
      + ppc.payment_pool_credit_tax_money as Total_Amount
    , src = convert(varchar(4),'ppc')
   from payment_pool_credit as ppc
  union all
  select format(pps.payment_pool_sadad_date, 'dd/mm/yyyy') as Payment_Date
    , pps.payment_pool_sadad_owner_money as owner_Amount
    , pps.payment_pool_sadad_tax_money as commission
    , pps.payment_pool_sadad_owner_money 
      + pps.payment_pool_sadad_tax_money as Total_Amount
    , src = convert(varchar(4),'pps')
  from payment_pool_sadad as pps
  union all
  select format(ppap.payment_pool_at_place_date, 'dd/mm/yyyy') as Payment_Date
    , ppap.payment_pool_at_place_owner_money as owner_Amount
    , ppap.payment_pool_at_place_tax_money as commission
    , ppap.payment_pool_at_place_owner_money 
      + ppap.payment_pool_at_place_tax_money as Total_Amount
    , src = convert(varchar(4),'ppap')
  from payment_pool_at_place as ppap
 ) as t
group by Payment_Date

针对新样本更新:

select PaymentDate
  , count(Payment_Date) as Transaction_count
  , sum(owner_Amount) as owner_amount
  , sum(commission) as commission
  , sum(Total_Amount) as Sub_total
  , sum(case when src = 'ppap' then Total_Amount end) as Total_Amount_At_Place
from (
   select Payment_Date
    , ppc.owner_amount as owner_Amount
    , ppc.tax_amount as commission
    , ppc.owner_amount 
      + ppc.tax_amount as Total_Amount
    , src = convert(varchar(4),'ppc')
   from payment_pool_credit as ppc
  union all
  select Payment_Date
    , pps.owner_amount as owner_Amount
    , pps.tax_amount as commission
    , pps.owner_amount 
      + pps.tax_amount as Total_Amount
    , src = convert(varchar(4),'pps')
  from payment_pool_sadad as pps
  union all
  select Payment_Date
    , ppap.owner_amount as owner_Amount
    , ppap.tax_amount as commission
    , ppap.owner_amount 
      + ppap.tax_amount as Total_Amount
    , src = convert(varchar(4),'ppap')
  from payment_pool_at_place as ppap
 ) as t
 where Payment_Date != '20160617' /* this is missing from your desired results */
group by Payment_Date
order by format(payment_date,'dd/MM/yyyy') /* to match desired results order */

返回:

+-------------+-------------------+--------------+------------+-----------+-----------------------+
| PaymentDate | Transaction_count | owner_amount | commission | Sub_total | Total_Amount_At_Place |
+-------------+-------------------+--------------+------------+-----------+-----------------------+
| 2016-05-05  |                 1 | 5000.00      | 200.00     | 5200.00   | NULL                  |
| 2017-02-11  |                 4 | 1152.00      | 140.00     | 1292.00   | NULL                  |
| 2016-05-15  |                 6 | 2512.00      | 560.00     | 3072.00   | 1400.00               |
| 2016-06-22  |                 1 | 500.00       | 300.00     | 800.00    | 800.00                |
+-------------+-------------------+--------------+------------+-----------+-----------------------+

【讨论】:

结果假设它看起来像这样 Payment_Date |交易计数 | owner_Amount |佣金 |小计 | Total_Amount_At_Place 15/5/2016 | 3 | 2000 | 300 | 2300 | 500 @FaisalFahad 如果您可以编辑您的问题以提供示例数据和预期结果,这可能有助于澄清情况。 @FaisalFahad 已更新以针对样本进行测试

以上是关于如何从多个聚合表中检索数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有多个关联的两个 MySQL 表中检索数据

如何使用公共列从多个表中检索数据

从多个表中检索对象数据帮助

使用 LINQ 从多个表中检索数据

用于从多个表中检索数据的 Sql 查询

通过比较多个表条目从单个表中检索数据的 SQL 语句