【问题标题】:group by does not work correctly join two tablesgroup by 无法正常工作连接两个表
【发布时间】:2017-02-08 18:31:45
【问题描述】:

我想获取每个活动的每种付款方式售出的门票数量。我有以下查询:

SELECT  count(distinct(a.performance_id)) as EventQuantity,
        sum(a.admission_count)  as TicketQuantity
FROM   vw_PrecioTipoZona_Paid as a 
WHERE 1 = 1
AND a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF'
GROUP BY a.performance_id

我得到了这个结果,没关系:

EventQuantity   TicketQuantity
   1                    203

但是当与其他表连接时,结果是总和,在这种情况下a.admission_count 乘以其他表中的记录数。

有问题的查询是这样的:

SELECT      a.performance_id,
            count(distinct(a.performance_id)) as EventQuantity,
            sum(a.admission_count)  as TicketQuantity,
            b.payment_method as PaymentMethod
FROM   vw_PrecioTipoZona_Paid as a inner join vw_Payment_UserByPerformance as b
       on a.performance_id = b.performance_id
WHERE 
    1 = 1
    and a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF'
    group by a.performance_id, b.payment_method

通过这个查询,我得到了这个结果:

EventQuantity   TicketQuantity  PaymentMethod
   1               10353            Cash
   1               5887             Card
   1               1624         MasterCardECommerce
   1                812           VisaEcommece

而这个结果是错误的,结果应该是:

EventQuantity   TicketQuantity  PaymentMethod
       1             111             Cash
       1              63             Card
       1              17       MasterCardECommerce
       1              8             VisaEcommece

vw_Payment_UserByPerformance 视图结构如下:

performance_id  user_role_id    userrole_name   userrole_group  date_transaction    user_id user_name   owner_user_id   owner_user_name amount_adm_net  amount_req_net  amount_charge_charge    amount_total    amount_net  chargeTransaction   tax payment_method

vw_PrecioTipoZona_Paid 视图结构如下:

performance_id  performance_name    performance_start_date  date_transaction    user_role_id    userrole_name   userrole_group  user_id user_name   price_type  price_zone  price_zone_priority admission_count NET charge1 charge2 charge3 charge4 charge5 GROSS

我必须进行子查询吗?这里的问题在哪里?

【问题讨论】:

  • 预期的结果集是什么?另外,count(distinct(a.performance_id)) 有什么意义,因为您是按同一字段分组的?
  • 有助于将所有标识(在这种情况下为表名和列名)翻译成英文,以便我们更好地理解表的语义。
  • @GiorgosBetsos 我还想知道每种活动的每种付款方式售出的门票数量。
  • 我猜你的 join 条件是错误的,两个表之间必须有 1:1 的关系才能工作(如果你希望我们添加表描述,你可能需要添加帮助您识别潜在的关系,尽管您应该添加它们以使您的数据模型更清晰)。您还需要将 PaymentMethod 添加到您的 group by,您可能已经这样做了,否则您的第二个查询将不会给出您显示的输出。
  • @Solarflare 我认为这个问题是因为有两个视图,而不是表。

标签: mysql sql sql-server join group-by


【解决方案1】:

MySQl 允许您错误地使用 group by。您永远不应该使用您在此查询中使用的技术。

SELECT      a.performance_id,
            count(distinct(a.performance_id)) as EventQuantity,
            sum(a.admission_count)  as TicketQuantity,
            b.payment_method as PaymentMethod
FROM   vw_PrecioTipoZona_Paid as a inner join vw_Payment_UserByPerformance as b
       on a.performance_id = b.performance_id
WHERE 
    a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF'
    group by a.performance_id, b.payment_method

当您使用 group by 时,保证正确结果的唯一方法是按所有非聚合字段进行分组。所有其他数据库都将这部分语法纳入其中,因此不存在此问题。

如果这仍然没有给出正确的结果,那么你的意图和你写的内容的细节有问题。我们需要查看业务需求、表结构、表中的示例数据和示例结果,以帮助您找到正确的查询。

查看您在撰写本文时添加的其他详细信息,我认为您需要使用派生表。

SELECT      a.performance_id,
            count(a.performance_id) as EventQuantity,
            a.admission_count  as TicketQuantity,
            b.payment_method as PaymentMethod
FROM   (select performance_id, sum(admission_count) as Admissioncount vw_PrecioTipoZona_Paid 
WHERE a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF'
group by performance_id )as a
 inner join vw_Payment_UserByPerformance as b
       on a.performance_id = b.performance_id
    group by a.performance_id, b.payment_method

【讨论】:

  • 此查询返回与我相同的结果。
【解决方案2】:

你的问题中已经有了它:

我想获取每种付款方式售出的门票数量,并且我已经 跟随查询

所以你基本上是在看这样的查询:

SELECT payment_method, COUNT(*) FROM x GROUP BY payment_method;

您似乎在做一些不同的事情,如果您的组也在payment_method 列上,结果可能会像这样:

SELECT      
    a.performance_id AS performanceId,
    b.payment_method AS paymentMethod,
    COUNT(*) numPayments
FROM   
    vw_PrecioTipoZona_Paid as a
INNER JOIN
    vw_Payment_UserByPerformance AS b ON (a.performance_id = b.performance_id)
WHERE 
    a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF'
GROUP BY
    a.performance_id,
    b.payment_method

【讨论】:

  • 不是真的@pintxo,我不适合我。我想要每种支付方式的门票销售数量,应该是这样的:万事达卡 3,维萨卡 1
【解决方案3】:

首先,这没有意义:

SELECT a.performance_id,
       count(distinct(a.performance_id)) as EventQuantity,
...
GROUP BY a.performance_id

您正在对具有相同 performance_id 的东西进行分组,然后要求显示该组中有多少 DISTINCT performance_id。

猜猜答案总是什么?

其次,SQL 是一种声明性语言,所以先声明你想要什么。

如果您不能用 SQL 充分表达它(这没关系) - 然后用文字表达,并请用它更新您的问题。 猜测缺乏投入很少有成效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多