首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL中的计算行

SQL中的计算行
EN

Stack Overflow用户
提问于 2018-05-31 07:55:54
回答 2查看 3.3K关注 0票数 1

我有一个表,其中有一个名为metrics的列,它有不同的可能指标,如下所示:

代码语言:javascript
复制
Metric  Value
--------------
A       100
B       200
C       300

我想从这个基表派生出另一个表,它可能包含如下行:

代码语言:javascript
复制
Metric  Value
--------------
A       100
B       200
C       300
C/A     3
B/A     2

基本上保持原始行不变+根据现有值的组合添加一些新行。

我可以想到的一种方法是: 1.透视数据2.将其放入某个临时表或CTE中3.选择所有现有指标列+我需要的新计算列4.取消透视上一步的输出

有没有更好的方式用SQL来实现这一点?或者任何其他可能的方式?另外,redshift不支持Pivot函数,除了使用Case语句之外,还有其他解决方法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-05-31 08:22:02

您可以将表与自身连接起来,并将操作应用于您喜欢的指标对。并按原样对表执行UNION ALL操作,以包括原始指标。

对于您的示例,一种可能性是(假设Postgres):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-05-31 08:26:21

代码语言:javascript
复制
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+

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50614841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档