У меня есть следующая таблица с одним столбцом 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?

0
matthias 29 Окт 2015 в 13:23

2 ответа

Лучший ответ

В 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
Gordon Linoff 29 Окт 2015 в 11:02

Вы можете группировать по любому выражению, но вы должны повторить его после 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;
1
diziaq 29 Окт 2015 в 10:45