SQLite中的透视(将列转换为行)

wixjitnu  于 2023-03-03  发布在  SQLite
关注(0)|答案(2)|浏览(400)

我想知道如何在SQLite中创建透视表。我有一个结构如下的表:

IDUR IDPIX

2345  4567

2345  4568

2345 4569

我需要得到这个:

IDUR IDPIX1 IDPIX2 IDPIX3

2345  4567   4568   4569

如何做到这一点,使用SQLite?

sycxhyv7

sycxhyv71#

SQLite不支持row_number()(或任何类似的东西),因此透视它是一个挑战。

select idur, group_concat(IDPIX) as IXPIXes
from t
group by idur;

这很容易,但它并不能产生你所要求的东西。
编辑:
在Postgres中,您可以使用条件聚合或crosstab()

select idur,
       max(case when seqnum = 1 then IDPIX end) as IDPIX_1,
       max(case when seqnum = 2 then IDPIX end) as IDPIX_2,
       max(case when seqnum = 3 then IDPIX end) as IDPIX_3
from (select t.*, row_number() over (partition by idur order by NULL) as seqnum
      from t
     ) t
group by idur;

在MySQL中,最简单的方法是使用变量。

vs91vp4v

vs91vp4v2#

我知道这是一个老线程,所以也许SQLite当时没有row_number,但现在它有row_number,所以今天可以很容易地完成。
因此,假设您知道需要转换为列的行数(在示例中为3),则可以通过以下方式解决问题:

添加更多数据

我想再添加一点数据,这样您就可以看到两个独立的IDUR值从行转换为列
| 伊杜尔|IDPIX|
| - ------|- ------|
| 小行星2345|小行星4567|
| 小行星2345|小行星4568|
| 小行星2345|小行星4569|
| 小行星234|小行星4570|
| 小行星234|小行星4571|
| 小行星234|小行星4572|

使用电极导线

这里我们使用LEAD来获取当前行、下一行和下两行的IDPIX。(从技术上讲,我们不需要LEAD(IDPIX,0...,我们可以直接获取IDPIX,但它使我们可以轻松地以统一的格式并排阅读和查看它们)。

WITH
    CTE AS (
        SELECT
            ROW_NUMBER() OVER(PARTITION BY IDUR ORDER BY IDPIX) AS ROW_RANKING,
            IDUR,
            LEAD(IDPIX,0,NULL) OVER(PARTITION BY IDUR ORDER BY IDPIX) AS IDPIX1,
            LEAD(IDPIX,1,NULL) OVER(PARTITION BY IDUR ORDER BY IDPIX) AS IDPIX2,
            LEAD(IDPIX,2,NULL) OVER(PARTITION BY IDUR ORDER BY IDPIX) AS IDPIX3
        FROM
            @tbl
    )
SELECT
    IDUR,
    IDPIX1,
    IDPIX2,
    IDPIX3
FROM
    CTE
WHERE
    ROW_RANKING = 1

输出

| 伊杜尔|识别像素1|IDPIX 2接口|IDPIX 3接口|
| - ------|- ------|- ------|- ------|
| 小行星2345|小行星4567|小行星4568|小行星4569|
| 小行星234|小行星4570|小行星4571|小行星4572|

相关问题