【问题标题】:SQL Group By QuerySQL 分组查询
【发布时间】:2015-10-29 10:23:04
【问题描述】:

我有下表一列ArbPlWPos

+------------+
+ IH-MKE     +
+ IH-MKEEA   +
+ IH-MKEEB   +
+ IH-MKEPE   +
+ IH-MKEPM   +
+ IH-MVKE1   +
+ IH-MVKM1   +
+------------+

我可以在 MS Access 中运行按前 6 个字母分组的语句:

SELECT left(ArbPlWPos, 6), count(left(ArbPlWPos, 6))
  FROM my_table
 GROUP BY left(ArbPlWPos, 6)

+------------+------+
+ IH-MKE     +  10  +
+ IH-MKM     +  20  +
+ IH-MVK     +  30  +
+------------+------+

如何将IH-MVK 包含到IH-MKE 中,所以结果应该是:

+------------+------+
+ IH-MKE     +  40  +
+ IH-MKM     +  20  +
+------------+------+

这是否可以通过 SQL/Access 以某种方式实现?

【问题讨论】:

  • 您将 IH-MVK 纳入 IH-MKE 而不包括 IH-MKM 的标准是什么?

标签: sql ms-access group-by


【解决方案1】:

在 MS Access 中,您可以使用条件表达式 iif()

SELECT iif(ArbPlWPos like "IH-MVK*", "IH-MKE", left(ArbPlWPos, 6)),
       count(*)
FROM TABLE
GROUP BY iif(ArbPlWPos like "IH-MVK*", "IH-MKE", left(ArbPlWPos, 6));

【讨论】:

    【解决方案2】:

    您可以按任何表达式进行分组,但您要在 SELECT(是否需要)之后和 GROUP BY 之后重复它,就像您对通常的列所做的那样。例如:

      SELECT my_function_or_expression(column_A, column_B), count(1)
        FROM my_table
      GROUP BY my_function_or_expression(column_A, column_B);
    

    你的情况是:

      SELECT 
         CASE WHEN left(ArbPlWPos, 6) = 'IH-MVK'
              THEN 'IH-MKE'
              ELSE left(ArbPlWPos, 6) END AS cutArbPlWPos,
         count(1) AS amount
        FROM my_table
      GROUP BY CASE WHEN left(ArbPlWPos, 6) = 'IH-MVK'
                    THEN 'IH-MKE'
                    ELSE left(ArbPlWPos, 6) END;
    

    您也可以使用子查询来简化它。

    SELECT cutArbPlWPos, count(1)
      FROM (SELECT 
             CASE WHEN left(ArbPlWPos, 6) = 'IH-MVK'
                  THEN 'IH-MKE'
                  ELSE left(ArbPlWPos, 6) END AS cutArbPlWPos
            FROM my_table
           )
     GROUP BY cutArbPlWPos;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多