【问题标题】:Combine two queries into one to cherry pick related columns将两个查询合二为一以挑选相关列
【发布时间】:2019-11-30 21:26:00
【问题描述】:

我有两张表,一张名为 customer_sales,另一张为 distinct_customers。

此查询返回每个 d_id 的总销售额和客户编号(但没有客户名称)

select cs.d_id, cs.customer_number, cs.total_sales from cs_sales cs where cs.d_id = 'A00007';

此查询从 d_id 返回客户信息(包括姓名)

select  dc.c_name, dc.c_number, dc.d_name from dcust dc where d_id ='A00007';

我想结合这两个查询,这样我就可以得到这样的结果

|-------|--------|-----------|-------------|
|d_id   | c_name |   d_name  | total_sales |
|-------|--------|-----------|-------------|

最好的方法是什么? 我尝试了不同的方法,我不断地获取重复的信息。

Distinct_customers 样本数据

customer_sales 样本数据

【问题讨论】:

  • 最好能展示一下您尝试过的内容以及获得的结果
  • @DmitryReutov 我尝试了类似于以下答案的更好的方法,但它返回了 c_name 和 d_name 重复的重复记录
  • 您的问题中的查询是否每个仅返回 1 行?
  • @forpas 我添加了一些示例数据。这让我发疯了哈哈
  • 所以每个表中有多行 d_id ='A00007',你没有在你的问题中澄清。您的预期输出是什么?

标签: mysql sql database foreign-keys subquery


【解决方案1】:

你也应该加入customer_number

SELECT cs.d_id, dc.c_name, dc.d_name, cs.total_sales
FROM cs_sales cs INNER JOIN dcust dc
ON cs.d_id = dc.d_id AND dc.customer_number = cs.customer
WHERE cs.d_id ='A00007'

【讨论】:

  • 轰隆隆!你的天才。就是这样。非常感谢。
【解决方案2】:

下面的代码应该可以完成这项工作:

SELECT cs.d_id, dc.c_name, dc.d_name, SUM(cs.total_sales)
FROM cs_sales cs
LEFT JOIN dcust dc
ON cs.d_id=dc.d_id
GROUP BY cs.d_id, dc.c_name, dc.d_name

【讨论】:

  • 这几乎正是我所需要的,但不是返回总和,我怎样才能让它返回每行的每笔销售? A00007 Neomi Ashbaug A00007 Ibex Dealer 1695348 A00007 Oswaldo Klein A00007 Ibex Dealer 1695348 A00007 Rachele Nazar A00007 Ibex Dealer 3390696 A00007 Raisa Virgen A00007 Ibex Dealer 1695348 A00007 Reynalda Jury A00007 Ibex Dealer 1695348 A00007 Rolando Kibbe A00007 Ibex Dealer 1695348
  • 它不会给出重复的结果吗? (正如您在@thiagotrss 的评论中提到的)请解释您希望对哪些字段进行重复数据删除以及对哪些字段进行分组
【解决方案3】:

您只需加入表格:

select cs.d_id, dc.c_name, dc.d_name, cs.total_sales
from dcust d inner join cs_sales cs 
on d.d_id = cs.d_id
where d_id = 'A00007'

【讨论】:

  • 我尝试了类似的方法,但这会返回重复的结果。 A00007 Deandra Craft A00007 Ibex Dealer 52425 A00007 Deandra Craft A00007 Ibex Dealer 53790 A00007 Deandra Craft A00007 Ibex Dealer 5927 A00007 Deandra Craft A00007 Ibex Dealer 23069 A00007 Deandra Craft A00007 Ibex Dealer 56121
【解决方案4】:

很奇怪,您在两个表中都有经销商 ID。根据命名,我怀疑您只想加入客户而不是经销商:

SELECT cs.d_id, c.c_name, c.d_name, cs.total_sales
FROM cs_sales cs INNER JOIN
     dcust c
     USING (c.customer_number) 
WHERE cs.d_id = 'A00007';

我将cs.d_id 解释为类似于“客户注册的经销商”。我不明白为什么它必须与实际销售地点相同。因此,如果您想了解指定经销商的销售额,请使用来自cs_sales 的经销商信息。

如果该列是多余的,那么您应该修复您的数据模型,以便该列不会在两个表中重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 2014-06-23
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多