【问题标题】:Query Help - How to get all customers who have shopped at any of the top 20 stores?查询帮助 - 如何获取所有在前 20 家商店购物过的顾客?
【发布时间】:2019-01-20 22:48:20
【问题描述】:

我需要获取在总销售额 ($) 排名前 20 位的商店中购物过的所有客户。我也想拥有不同的客户。

这是我有的 5 张桌子。

消费者:有客户 ID 和其他一些详细信息

商家:有storeid(这个我没用过)

transaction:有customer id和orderid,这个表没有item数据。

order : 有 orderid 和 itemid 以及 storeid

itemtable : 包含商品详细信息,例如价格、名称和订单编号

到目前为止,我的这个查询似乎不起作用。

select con.* 
from consumer con 
where con.id =
    (select 
        trans.consumerid 
    from transaction trans 
    join order ord on trans.orderid = ord.id 
    join
        (select 
            ord.merchantid 
        from order ord 
        join itemtable item on ord.id = item.orderid 
        group by ord.merchantid 
        order by sum(ordet.price) desc
        limit 50
        ) s20 
        on s20.merchantid = ord.merchantid
    )

它在 Spark 上给了我这个当前错误:

SQL 语句出错:RuntimeException:用作表达式的子查询返回多行:

我真的被困在这个问题上,如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 尝试使用 in 代替 =。 ` where con.id in (...)`
  • 由于您的子查询可以返回多个值,因此您需要使用con.id IN (SELECT ...) 而不是con.id = (SELECT ...)
  • 假设它是前 3 家商店。见meta.stackoverflow.com/questions/333952/…
  • ...注意 order 是 MySQL 中的保留字

标签: mysql sql apache-spark-sql


【解决方案1】:

你可以使用in:

select c.* 
from consumer c 
where c.id in (select t.consumerid 
               from transaction t join 
                    order o
                    on t.orderid = o.id join
                    (select o.merchantid 
                     from order o join
                          itemtable i
                          on o.id = i.orderid 
                     group by o.merchantid 
                     order by sum(i.price) desc
                     limit 20
                    ) s20 
                    on s20.merchantid = o.merchantid
                );

【讨论】:

    【解决方案2】:

    你试图用 = 做的事情应该用 join(或 in,或存在)来完成

    select distinct con.* 
    from
      consumer con    
      inner join transaction trans on con.id = trans.consumerid
      inner join order ord on trans.orderid = ord.id 
      inner join
        (select 
            ord.merchantid 
        from 
          `order` ord 
          inner join itemtable item on ord.id = item.orderid /*whaaat, a stock item has an orderid? Sounds messed up..*/
        group by ord.merchantid 
        order by sum(item.price) desc /*check this-your query has alias "ordet" not defined anywhere*/
        limit 20 /*you wrote 50?*/
        ) s20 
        on s20.merchantid = ord.merchantid
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-01
      • 2016-11-09
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2011-12-04
      相关资源
      最近更新 更多