Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将与两个不同值相关的值分组/聚合为一个值?_Sql_Oracle - Fatal编程技术网

Sql 如何将与两个不同值相关的值分组/聚合为一个值?

Sql 如何将与两个不同值相关的值分组/聚合为一个值?,sql,oracle,Sql,Oracle,因此,在数据库中的“value_type”列中有一个值,可以相互交换。当我进行合计时,我希望能够将两个值(A和B)相加/合计,但不能将其他值(C)相加/合计?以下是一些样本数据: Value_ID Value_Tx Value_Type 1 5 A 2 2 A 3 7 B 4

因此,在数据库中的“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;
提前谢谢

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;

简单方法,希望能帮助您:)

使用
分组方式表达用例

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; 

我只在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

如何动态设置组的示例:

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

你如何把A和B分成一组?实际情况/要求是什么?剩下的似乎没那么难。是的,A&B基本上是“相同的东西”,但在数据库中被称为不同的东西,所以我想把它们归为“一”。顺便问一下,你为什么希望这是家庭作业?o、 其他带有insert的post可能应该是纯SQL,而不是PL/SQL或批量插入。这就是为什么我开玩笑地希望那是你的家庭作业,而不是真正的工作。就这一组而言,是什么告诉我A和B是同一组?是的,你不是100%不正确。哈哈,顺便说一句,谢谢你。没什么,我必须把它们联系起来,认为它们是“相同的价值”。i、 e.我希望所有值都在一个组中1和2。我发布了我的解决方案-基于您在评论中所写内容的动态组。请看一下顶部/联合所有部分-这是我称之为模拟数据的部分,您必须准备这些数据并将其与您的问题一起发布,以节省我们为您键入的时间。