【问题标题】:SQL query to select rows based on conditionSQL查询根据条件选择行
【发布时间】:2014-02-21 09:33:01
【问题描述】:
SELECT
    MNo, X, Y, Z
FROM
    Coord C
    JOIN Result R ON R.ResultID = C.ResultID
    JOIN Member M ON M.MemberID = R.MemberID
WHERE
    M.StdID = @stdID
GROUP BY
    MNo

我有一个查询,女巫给了我由 MNo 代表的每个成员的 x、y 和 z 坐标。有些成员可以有不止一排坐标,我想得到这些坐标(并且只有那些)的平均值,比如

MNo x y z 15 10.6 12.3 20.1 16 11.1 17.8 14.0

省略成员 1-14 和 17- 只有一行坐标。我该怎么做?

【问题讨论】:

  • 您使用哪种 RDMS?我认为您可以使用数据透视表解决您的问题。
  • 您从中得出此输出的样本数据是什么?
  • 意思是“通常的平均值”就是AVG(X), AVG(Y), AVG(Z),比如说,MySQL。其他数据库可能会有所不同,但应该具有相同的聚合函数,可能名称不同。

标签: sql select conditional-statements


【解决方案1】:

对于您问题的第 1 部分 - 平均,您需要的是 AVG。

对于您问题的第 2 部分 - 如何过滤掉成员 1-14 和 17-,您需要一个 WHERE 子句。

对于您问题的第 3 部分 - 如何摆脱只有 1 行坐标的成员,您需要一个 HAVING 子句。

把这些放在一起,我们有:

SELECT
    MNo, AVG(X) AS X, AVG(Y) AS Y, AVG(Z) AS Z
FROM
    Coord C
    JOIN Result R ON R.ResultID = C.ResultID
    JOIN Member M ON M.MemberID = R.MemberID
WHERE
    M.StdID = @stdID
   AND M.MNo NOT BETWEEN 1 AND 14
   AND M.MNo NOT BETWEEN 17 and 20
GROUP BY
    MNo
HAVING
    COUNT(1) > 1

注意事项:

  • 如果您只调用了成员 1-14 和 17- 因为这些成员只有一组坐标,那么您可以忽略这两个“AND M.MNo NOT IN”语句。
  • COUNT(1) 中的字段并不重要(也可以是 COUNT(*) 或 COUNT(X) 等 - 任何字段都将返回行数,而 HAVING 过滤器将删除以下情况只有 1 行。

【讨论】:

  • 我相信 1-14 和 17- 只是 3) 的示例,所以看起来 2) 和 3) 可能是相同的要求?此外,在这种情况下,COUNT(*)(或COUNT(1))可能是最不容易混淆的,因为它确实是在计算行(记录)。
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 2016-01-23
  • 1970-01-01
  • 2023-03-09
  • 2021-11-11
  • 2022-12-20
  • 2013-10-23
  • 2019-11-18
相关资源
最近更新 更多