Как я могу сгруппировать / агрегировать значения, соотнесенные с двумя различными значениями как одно? - PullRequest
0 голосов
/ 26 апреля 2018

Таким образом, в базе данных есть значение в столбце 'value_type', которое взаимозаменяемо друг с другом. Когда я агрегирую, я хочу иметь возможность суммировать / агрегировать два значения (A И B) вместе, но не другие (C)? Некоторые примеры данных ниже:

Value_ID       Value_Tx         Value_Type
   1              5                A
   2              2                A 
   3              7                B
   4              5                C
   5              3                C
   6              1                D
   7              7                F

Результат, который я хочу:

 Sum            Value_Type
  14               A | B
  8                 C
  1                 D
  7                 F

Я знаю, что для суммирования я бы сделал:

select sum(value)tx, value_type
  from table
 group by value_type;

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

Пример того, как установить группы динамически:

WITH test_data AS
(
 SELECT 1 val_id, 5 val_tx, 'A' val_typ FROM dual
 UNION ALL
 SELECT 2, 2, 'A' FROM dual 
 UNION ALL
 SELECT 3, 7, 'B' FROM dual 
 UNION ALL
 SELECT 4, 5, 'C' FROM dual 
 UNION ALL
 SELECT 5, 3, 'C' FROM dual 
 UNION ALL
 SELECT 6, 1, 'D' FROM dual 
 UNION ALL
 SELECT 7, 7, 'F' FROM dual 
 )
 SELECT break_group, SUM(val_tx) total_tx, value_type FROM 
 (
  SELECT val_id, val_tx, val_typ
  , CASE WHEN dense_rnk IN (1, 2) THEN 1 ELSE (dense_rnk-1) END break_group
  , CASE WHEN dense_rnk IN (1, 2) THEN 'A|B' ELSE val_typ   END value_type
  FROM
  (
   SELECT val_id, val_tx, val_typ
        , DENSE_RANK() OVER (ORDER BY val_typ) dense_rnk 
    FROM test_data
  )
 )
 GROUP BY break_group, value_type
 ORDER BY break_group
/

Выход:

 BREAK_GROUP  TOTAL_TX   VALUE_TYPE
 -----------------------------------
 1            14         A|B
 2             8          C
 3             1          D
 4             7          F
0 голосов
/ 26 апреля 2018

Используйте регистр с group by.

SELECT SUM(value_tx), 
       CASE 
         WHEN value_type IN ( 'A', 'B' ) THEN 'A | B ' 
         ELSE value_type 
       END 
FROM   t 
GROUP  BY CASE 
            WHEN value_type IN ( 'A', 'B' ) THEN 'A | B ' 
            ELSE value_type 
          END 
ORDER  BY 2; 

Демо

0 голосов
/ 26 апреля 2018

Я только попробовал мой запрос в MySQL

select sum(value_tx), 
case 
   when value_type IN ('A', 'B') THEN 'A | B'
   else value_type
end as valtype
from table
group by valtype
0 голосов
/ 26 апреля 2018
select sum(value)tx, 'A | B' value_type
  from table where value_type  in ('A','B')

union all

select sum(value)tx, value_type
  from table where value_type not in ('A','B')
 group by value_type;

легкий путь, надеюсь, поможет вам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...