将行转换为列的查询SQLite

将行转换为列的查询SQLite,sqlite,Sqlite,下午好, 我想知道是否可以根据表中的行数进行查询以生成列 example: ID COD DIAG 111111111 | Z359 | D 111111112 | Z359 | D 111111112 | Z359 | D 111111113 | Z359 | R 111111113 | Z359 | P 111111113 | Z359 | R 111111

下午好, 我想知道是否可以根据表中的行数进行查询以生成列

example:

      ID       COD    DIAG
    111111111 | Z359 |  D   
    111111112 | Z359 |  D   
    111111112 | Z359 |  D   
    111111113 | Z359 |  R   
    111111113 | Z359 |  P   
    111111113 | Z359 |  R   
    111111114 | Z359 |  D   
    111111114 | Z359 |  D   
    111111114 | Z359 |  D   
    111111115 | Z359 |  D   


it would be ideal that columns be created according to the number of rows for each id, if not possible it would put a fixed number of columns.

    result query

        ID    | COD1 | DIAG1 | COD2 | DIAG2 | COD3 | DIAG3 
    111111111 | Z359 |   D   |      |       |      | 
    111111112 | Z359 |   D   | Z359 |   D   |      |
    111111113 | Z359 |   R   | Z359 |   P   | Z359 |  R
    111111114 | Z359 |   D   | Z359 |   D   | Z359 |  D
    111111115 | Z359 |   D   |      |       |      | 
对不起,我的英语不好


非常感谢

第一个查询遵循的模式是,包含在此处以供比较

编号为 选择上面的行号 按ID划分按COD、DIAG排序 如下文所述, t* 来自SO58566470 t 选择ID, 当seq=1时的最大情况,则COD结束为COD1, 当seq=1时的最大情况,则DIAG结束为DIAG1, 最大情况下,当seq=2时,COD结束为COD1, 当seq=2时的最大情况,则DIAG结束为DIAG1, 最大情况下,当seq=3时,则COD结束为COD3, 当seq=3时的最大值,则DIAG结束为DIAG3 从编号n开始 按ID分组; 但这确实是对窗口函数的天真使用,因为它可以通过同时计算其他值来最大化窗口。第一个查询已经在收集和遍历分区行以获取行号,但它实际上通过在下一个查询中使用aggregate max函数收集值来重复该过程两次

下面的查询看起来更长,可能更复杂,但它通过在同一过程中收集转换后的值来利用分区数据,即窗口数据。但由于窗口函数必须对每一行进行操作,因此有必要过滤掉不完整的行。我没有对查询进行任何类型的分析,但我怀疑第二个查询总体上效率更高

WITH transform AS (
    SELECT id,
           lag(COD, 0)  OVER IDWin AS COD1,           
           lag(DIAG, 0) OVER IDWin AS DIAG1, 
           lag(COD, 1)  OVER IDWin AS COD2,
           lag(DIAG, 1) OVER IDWin AS DIAG2,
           lag(COD, 2)  OVER IDWin AS COD3,
           lag(DIAG, 2) OVER IDWin AS DIAG3,       
           row_number() OVER IDWin AS seq
    FROM SO58566470 t
    WINDOW IDWin AS (PARTITION BY ID ORDER BY COD, DIAG)
    ORDER BY ID, SEQ
  ),
  last AS (
    SELECT id, max(seq) as maxseq
    FROM transform
    GROUP BY id
  )
SELECT transform.*
FROM transform 
     JOIN last 
       ON transform.id = last.id AND transform.seq = last.maxseq
ORDER BY id;

遗憾的是,sqlite没有transform命令。可能的重复事实上,在转换sqlite表方面存在多个问题。首先搜索现有的问题和答案总是值得的。非常感谢您的回答,我学到了很多,我不知道这是否正确,但我使用函数组_CONCAT解决了问题,然后DBGrid创建了计算字段,以根据组_CONCAT的结果增加列数