SQL Group By Query

时间:2015-10-29 10:23:04

标签: sql ms-access group-by

我的下表有一列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可以以某种方式实现吗?

2 个答案:

答案 0 :(得分:2)

在MS Access中,您可以使用条件表达式new_visitonly

执行此操作
iif()

答案 1 :(得分:1)

您可以按任何表达式进行分组,但是您需要在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;