将特定行数据显示为列

Showing particular row data as column

我的table如下:

Date Code Price MA5 MA20
2022-01-01 APPLE 1000 1080 1090
2022-01-02 APPLE 1100 1084 1100
2022-01-03 APPLE 1200 1090 1100
2022-01-01 MICROSOFT 7 9 10
2022-01-02 MICROSOFT 7.5 8 9.5
2022-01-03 MICROSOFT 8 8.5 9
... ... ... ... ...
2022-01-01 NASDAQ 14400 15600 16700
2022-01-02 NASDAQ 14500 15200 16100
2022-01-03 NASDAQ 14600 15000 16000

我目前正在使用 MariaDB 在同一个 table 上保存纳斯达克价值和股票数据。

但是,我想将纳斯达克的 MA 值作为新列字段显示到字段的其余部分,如 NASDAQ_MA5、NASDAQ_MA20。

我的问题是,如何select nasdaq 的 MA5 和 MA20 值并将其作为匹配日期的值?我想要的输出如下:

Date Code Price MA5 MA20 NASDAQ_MA5 NASDAQ_MA20
2022-01-01 APPLE 1000 1080 1090 15600 16700
2022-01-02 APPLE 1100 1084 1100 15200 16100
2022-01-03 APPLE 1200 1090 1100 15000 16000
2022-01-01 MICROSOFT 7 9 10 15600 16700
2022-01-02 MICROSOFT 7.5 8 9.5 15200 16100
2022-01-03 MICROSOFT 8 8.5 9 15000 16000

我一直在尝试以下方法:

        SELECT *, 
        (PARTITION BY DATE, case when (code='NASDAQ') then MA5 else NULL end) as 'NASDAQ_MA5',
        (PARTITION BY DATE, case when (code='NASDAQ') then MA20 else NULL end) as 'NASDAQ_MA20'
        FROM TABLE

非常感谢您的帮助。

我确信有一种更有效的方法可以做到这一点,但这里有一种方法可以使用 2 个子查询来解决您的问题:

SELECT t1.*, (SELECT t2.MA5
              FROM tableA t2
              WHERE t1.date = t2.date
              AND code = 'NASDAQ') as NASDAQ_MA5,
              (SELECT t2.MA20
              FROM tableA t2
              WHERE t1.date = t2.date
              AND code = 'NASDAQ') as NASDAQ_MA20
FROM tableA t1
WHERE code != 'NASDAQ'

试试看 here

您可以在日期列上进行自联接并按 CODE = 'NASDAQ' 分隔数据。这是一种执行此操作的方法:

select a.*, b.ma5 as NASDAQ_MA5, b.ma20 as NASDAQ_MA20 from table1 a
left outer join (select date, ma5,ma20 from table1 where code = 'NASDAQ') b
on a.date = b.date where a.code <> 'NASDAQ'

您需要连接两组不同的数据。定义一个 CTE 以保持定义清晰可能是有意义的,然后加入您的主要 table - 如果总是有相应的日期,则可以是 内部加入 左加入如果可能没有。

假设每个日期只有一个纳斯达克代码,如果不是这种情况,您可以根据需要在 CTE 中汇总。

with nasdaq as (
    select date, MA5 NASDAQ_MA5, MA20 NASDAQ_MA20
    from t
    where code = 'NASDAQ'
)
select t.*, n.NASDAQ_MA5, n.NASDAQ_MA20
from t
left join nasdaq n on n.date=t.date
where t.code != 'NASDAQ';