SQL中的计算行

时间:2018-05-30 23:55:54

标签: sql

我有一个名为metrics的列表,其中包含不同的可能指标:

Metric  Value
--------------
A       100
B       200
C       300

我想从这个基表派生另一个表,可能有如下行:

Metric  Value
--------------
A       100
B       200
C       300
C/A     3
B/A     2

基本上按原样保留原始行+根据现有值的组合添加一些新行。

我能想到的一种方法是: 1.转动数据 2.把它放在临时表或CTE中 3.选择所有现有的度量标准列+我需要的新计算列 4.取消最后一步的输出

使用SQL实现这一目标有更好的方法吗?或许还有其他可能的方式? 此外,redshift不支持Pivot功能,除了使用Case Statements之外还有解决方法吗?

2 个答案:

答案 0 :(得分:0)

您可以自己加入表格,并对您喜欢的指标对应用操作。并UNION ALL表格包含原始指标。

你的例子的一种可能性是(假设Postgres):

SELECT metric,
       value
       FROM metrics
UNION ALL
SELECT concat(m1.metric, '/', m2.metric),
       m1.value / m2.value
       FROM metrics m1
            CROSS JOIN metrics m2
       WHERE (m1.metric,
              m2.metric) IN (('C',
                              'A'),
                             ('B',
                              'A'));

SQL Fiddle

当然,这可以扩展到三元,...操作,方法是添加其他连接和几个不同的操作,方法是添加其他查询并UNION

答案 1 :(得分:0)

select 
case when x1.metric = x2.metric 
    then x1.metric 
else x1.metric || ' / ' || x2.metric end,
case when x1.metric = x2.metric 
    then x1.value 
else x1.value / x2.value end

from mytable x1
join mytable x2
  on x1.metric = x2.metric or x2.metric = 'A'

这是一种方法,它使用纯粹的标准sql。但请注意,不同的RDMBS软件具有不同级别的标准一致性,并且可能不支持此处使用的某些功能。具体而言,字符串连接运算符||未在所有数据库中实现。有些数据库使用函数concat+代替。