mysql - 对维度进行分组的 SQL 场景

标签 mysql sql database database-design group-by

我正在使用 SQL,这是我遇到的情况

Table A
SubscriptionID | Club   | Sum_Of_Billings_Of_All_Month | EventID  


Table B:
Cost           | EventID   

表 A 在 EventID 上左连接表 B(跟踪每个订阅的费用)

结果

SubscriptionID | Club   | Sum_Of_Billings_Of_All_Month  | EventID  | Cost

我想将Sum_Of_Billings_Of_All_Month 分解为每天的账单。即对于每个订阅,我想要该月每天的账单明细。为此,我将分组Sum_Of_Billings_Of_All_Month而不是subscriptionID

后果

如果我按计费天数分组,加入后我将获得 subscriptionIDs 的重复项,并且 eventIDs 将在行中多次重复,然后计算成本倍数次也是如此。

我想要什么:

  • 在同一查询中,我希望能够按 SubscriptionID 进行分组,以便我可以保留每行的唯一订阅及其费用。

  • 但另一个要求是我还想了解账单明细,以便在同一查询中计算盈亏平衡和其他指标

这是实际的示例数据

表A

idCustomerSubscription  | ClubID  |     EventId     |   BillingDate|    FinalRevenue
33562784                | 56180001| 5y6m600np1fg    |   5/31/2017  |    512

表B

EventId         |Cost
5y6m600np1fg    |200

表 A 连接 B 在 eventId 上左连接(按 SubscriptionID 分组

idCustomerSubscription  |ClubID      |EventId     |BillingDate| FinalRevenue    | Cost  
33562784                | 56180001   |5y6m600np1fg| 5/31/2017 | 512      |200   

它达到了目的,因为每个订阅都有一个唯一的成本,但另一方面,这种查询不会给我账单日期的详细信息(我需要它来计算盈亏平衡)

表 A 连接 B 在 eventId 上左连接(按计费日期分组

idCustomerSubscription| ClubID  |EventId            |   BillingDate|    FinalRevenue    |Cost   
33562784              | 56180001|   5y6m600np1fg    |5/30/2017           |510           |200    
33562784              | 56180001|   5y6m600np1fg    |5/31/2017             |2               |200    

这将为我提供盈亏平衡所需的日期明细(30 日为 510,31 日为 2),但它会使成本重复(400 是成本,而不是 200)

<小时/>

我想找到一个 SQL 魔法,可以在其中保留每行唯一订阅的数量,并以某种方式跟踪同一查询中每个订阅的计费日期(无需按日期分组,因为这会使行重复) )。是否可以 ?

也许以某种方式,当事件ID加入并按日期分组时,它不会重复成本并且每个事件ID只计算一个成本?

最佳答案

我希望您能通过以下查询得到您想要的结果。尝试通过mn(别名)表的操作修改您的组。

select mn.idCustomerSubscription,mn.ClubID,mn.EventId,mn.BillingDate,mn.FinalRevenue,sq.cost
     from tableA Mn left join (select idCustomerSubscription,max(cost) cost, min(billingDate) billingDate from tableA a left join tableB b on a.eventid=b.eventid group by idCustomerSubscription) sq on mn.idCustomerSubscription=sq.idCustomerSubscription and mn.billingDate=sq.billingdate
group by mn.idCustomerSubscription,mn.ClubID,mn.EventId,mn.BillingDate

关于mysql - 对维度进行分组的 SQL 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44290634/

相关文章:

php - 如何将查询返回的两个字段加载到关联数组中?

java - 结果集的数据结构

java - 无法使用 java 连接到 godaddy MySQL

mysql - 查找一列是否包含另一列

sql server 将逗号分隔值拆分为列

mysql - SQL - 从 MySQL 数据中查找所有停机时间和停机时间长度(带有时间戳和状态消息的行集)

database - 通用数据库备份/提取格式

mysql - 在 MySQL 中实现一对一关系时确定外键

php - 通过循环查询创建多个表

mysql - 为什么查询时不使用索引?