首页 > 解决方案 > 如何使用 SQL 转置队列

问题描述

我正在寻找一种使用 SQL 转置队列的方法,以便第一个表看起来像第二个表。我正在使用火鸟 2.5

塔贝拉

编辑:上传的 DDL 和插入

https://file.io/A6FRsB3jRJ99

https://file.io/aXFC0ltDohYP

https://file.io/ksSe34zCXSCF

https://file.io/MyqMik9oaqYV

https://file.io/zoRhLvIS2kn1

https://file.io/fCe8I62UfFtu

https://file.io/7DjGrJqGyfG9

https://file.io/LQq8xjYWB80s

https://file.io/JO9BmPITxDAu

https://file.io/JKM3Q7oFaz5h

SELECT DISTINCT 
FAIXA.CODIGO,
FAIXA.COD_COR,
FAIXA.DESC_COR,
FAIXA.POSICAO,
    (CASE WHEN FAIXA.POSICAO = 1 THEN (FAIXA.QTDE) END) AS TAM1,
    (CASE WHEN FAIXA.POSICAO = 1 THEN (FAIXA.DT_FINAL) END) AS DT1,
    (CASE WHEN FAIXA.POSICAO = 2 THEN (FAIXA.QTDE) END) AS TAM2,
    (CASE WHEN FAIXA.POSICAO = 2 THEN (FAIXA.DT_FINAL) END) AS DT2,
    (CASE WHEN FAIXA.POSICAO = 3 THEN (FAIXA.QTDE) END) AS TAM3,
    (CASE WHEN FAIXA.POSICAO = 3 THEN (FAIXA.DT_FINAL) END) AS DT3,
    (CASE WHEN FAIXA.POSICAO = 4 THEN (FAIXA.QTDE) END) AS TAM4,
    (CASE WHEN FAIXA.POSICAO = 4 THEN (FAIXA.DT_FINAL) END) AS DT4,
    (CASE WHEN FAIXA.POSICAO = 5 THEN (FAIXA.QTDE) END) AS TAM5,
    (CASE WHEN FAIXA.POSICAO = 5 THEN (FAIXA.DT_FINAL) END) AS DT5,
    (CASE WHEN FAIXA.POSICAO = 6 THEN (FAIXA.QTDE) END) AS TAM6,
    (CASE WHEN FAIXA.POSICAO = 6 THEN (FAIXA.DT_FINAL) END) AS DT6,
    (CASE WHEN FAIXA.POSICAO = 7 THEN (FAIXA.QTDE) END) AS TAM7,
    (CASE WHEN FAIXA.POSICAO = 7 THEN (FAIXA.DT_FINAL) END) AS DT7,
    (CASE WHEN FAIXA.POSICAO = 8 THEN (FAIXA.QTDE) END) AS TAM8,
    (CASE WHEN FAIXA.POSICAO = 8 THEN (FAIXA.DT_FINAL) END) AS DT8,
    (CASE WHEN FAIXA.POSICAO = 9 THEN (FAIXA.QTDE) END) AS TAM9,
    (CASE WHEN FAIXA.POSICAO = 9 THEN (FAIXA.DT_FINAL) END) AS DT9,
    (CASE WHEN FAIXA.POSICAO = 10 THEN (FAIXA.QTDE) END) AS TAM10,
    (CASE WHEN FAIXA.POSICAO = 10 THEN (FAIXA.DT_FINAL) END) AS DT10,
    (CASE WHEN FAIXA.POSICAO = 11 THEN (FAIXA.QTDE) END) AS TAM11,
    (CASE WHEN FAIXA.POSICAO = 11 THEN (FAIXA.DT_FINAL) END) AS DT11,
    (CASE WHEN FAIXA.POSICAO = 12 THEN (FAIXA.QTDE) END) AS TAM12,
    (CASE WHEN FAIXA.POSICAO = 12 THEN (FAIXA.DT_FINAL) END) AS DT12,
    (CASE WHEN FAIXA.POSICAO = 13 THEN (FAIXA.QTDE) END) AS TAM13,
    (CASE WHEN FAIXA.POSICAO = 13 THEN (FAIXA.DT_FINAL) END) AS DT13,
    (CASE WHEN FAIXA.POSICAO = 14 THEN (FAIXA.QTDE) END) AS TAM14,
    (CASE WHEN FAIXA.POSICAO = 14 THEN (FAIXA.DT_FINAL) END) AS DT14,
    (CASE WHEN FAIXA.POSICAO = 15 THEN (FAIXA.QTDE) END) AS TAM15,
    (CASE WHEN FAIXA.POSICAO = 15 THEN (FAIXA.DT_FINAL) END) AS DT15,
    (CASE WHEN FAIXA.POSICAO = 16 THEN (FAIXA.QTDE) END) AS TAM16,
    (CASE WHEN FAIXA.POSICAO = 16 THEN (FAIXA.DT_FINAL) END) AS DT16,
    (CASE WHEN FAIXA.POSICAO = 17 THEN (FAIXA.QTDE) END) AS TAM17,
    (CASE WHEN FAIXA.POSICAO = 17 THEN (FAIXA.DT_FINAL) END) AS DT17,
    (CASE WHEN FAIXA.POSICAO = 18 THEN (FAIXA.QTDE) END) AS TAM18,
    (CASE WHEN FAIXA.POSICAO = 18 THEN (FAIXA.DT_FINAL) END) AS DT18,
    (CASE WHEN FAIXA.POSICAO = 19 THEN (FAIXA.QTDE) END) AS TAM19,
    (CASE WHEN FAIXA.POSICAO = 19 THEN (FAIXA.DT_FINAL) END) AS DT19,
    (CASE WHEN FAIXA.POSICAO = 20 THEN (FAIXA.QTDE) END) AS TAM20, 
    (CASE WHEN FAIXA.POSICAO = 20 THEN (FAIXA.DT_FINAL) END) AS DT20
FROM
( 
    SELECT
    A.NUMERO,
    A.DT_FINAL,
    A.CODIGO,
    B.COR COD_COR,
    C.DESCRICAO DESC_COR,
    B.TAM,
    B.QTDE,
    D.POSICAO 
FROM
    OF1_001 A
INNER JOIN OF_ITEN_001 B ON
    B.NUMERO = A.NUMERO
INNER JOIN CADCOR_001 C ON 
    C.COR = b.COR
INNER JOIN PRODUTO_001 E ON 
    E.CODIGO = A.CODIGO 
INNER JOIN FAIXA_ITEN_001 D ON
    (D.FAIXA = E.FAIXA
        AND D.TAMANHO = b.TAM)
WHERE A.ID_TIPO IN ('5', '6')
AND b.QTDE > 0 
AND a.codigo in (:codigo)                                                  
) FAIXA

标签: sqlfirebirdfirebird2.5

解决方案


未经测试,但也许是这样的?

with t1 as (
  select codigo, cod_cor, des_cor, tam1, dt1,
      row_number() over (order by null) as rn
  from your table
  where tam2 is null and tam3 is null
),
t2 as (
  select codigo, cod_cor, des_cor, tam2, dt2
      row_number() over (order by null) as rn
  from your table
  where tam1 is null and tam3 is null
),
t3 as (
  select codigo, cod_cor, des_cor, tam3, dt3
      row_number() over (order by null) as rn
  from your table
  where tam1 is null and tam2 is null
)
select
  coalesce(t1.codigo, t2.codigo, t3.codigo) as codigo,
  coalesce(t1.cod_cor, t2.cod_cor, t3.cod_cor) as cod_cor,
  coalesce(t1.des_cor, t2.des_cor, t3.des_cor) as des_cor,
  t1.tam1,
  t1.dt1,
  t2.tam2,
  t2.dt2,
  t3.tam3,
  t3.dt3    
from t1 
  full join t2
    on t1.rn = t2.rn
  full join t3
    on t1.rn = t3.rn

推荐阅读