【问题标题】:Complex SQL Query with two tables and group by count具有两个表并按计数分组的复杂 SQL 查询
【发布时间】:2020-06-06 13:48:54
【问题描述】:

我需要编写一个涉及两个表的复杂查询,我正在努力理解如何正确构造查询。

表结构如下,附样本数据:

Table 1:
ID | Type | Size
A123 | Block | Medium
C368 | Square | Large
X634 | Triangle | Small
K623 | Square | Small
Table 2:
ID | Code | Description | Price
A123 | C06 | Sensitive Material | 99.99
A123 | H66 | Heavy Grade | 12.76
A123 | U74 | Pink Hue | 299.99

C368 | H66 | Heavy Grade | 12.76
C368 | G66 | Green Hue | 499.99
C368 | C06 | Sensitive Material | 99.99
C368 | K79 | Clear Glass | 59.99

X634 | G66 | Green Hue | 499.99
X634 | K79 | Clear Glass | 59.99
X634 | Z63 | Enterprise Class | 999.99

K623 | K79 | Clear Glass | 59.99
K623 | G66 | Green Hue | 499.99
K623 | X57 | Extra Piping | 199.99

查询应主要基于表 1 中的类型列,然后根据匹配的 ID 汇总表 2 中的计数。

对于 Type = Square,最终输出应该是这样的计数:

Code | Description | Count
H66 | Heavy Grade | 1
G66 | Green Hue | 2
C06 | Sensitive Material | 1
K79 | Clear Glass | 2
X57 | Extra Piping | 1

如何使用这两个表组合这个结果?这是我写的一个初始查询 - 这看起来正确吗?它产生的结果类似于上面的示例,但我不确定它是否 100% 正确并捕获所有边缘情况。

select code, description, count(*) as total
from
(
SELECT code, description
FROM db.options_list ops
INNER JOIN db.obj_list ON ops.ID = db.obj_list.ID
WHERE db.obj_list.type="Square"
) src
group by code
order by total desc

谢谢

【问题讨论】:

标签: mysql sql join group-by count


【解决方案1】:

如果我理解正确,这只是一个简单的join/group by 查询:

SELECT ops.code, max(ops.description), count(*) as total
FROM db.options_list ops JOIN
     db.obj_list ol
     ON ops.ID = ol.ID
WHERE ol.type = 'Square'
GROUP BY ops.code
ORDER BY total desc;

注意事项:

  • 所有表都使用表别名。
  • 所有列引用都是合格的。
  • 字符串比较的分隔符是标准的单引号,而不是非标准的双引号。
  • SELECT 中的所有未聚合列都在 GROUP BY 中。
  • 子查询是不必要的。

您的查询可能适用于某些数据库。不过,我确实鼓励您在编写查询时遵循最佳实践。

【讨论】:

  • 谢谢你,@gordon。这是正确的(并且非常有用的指导方针)-有一个例外:我需要从 Group By 语句中删除 ops.description ,否则它不能正确地按 ops.code 进行聚类,因为即使代码也可能存在略微不同的描述是一样的。对不起,我一开始没有提到。谢谢!
  • @K997 。 . .我调整了答案。
【解决方案2】:

您似乎想要连接和聚合:

select op.type, ob.code, ob.description, count(*) cnt
from options_list op
inner join obj_list ob on op.id = ob.id
group by ol.type, ob.code, ob.description

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多