将sql行转换为单行多列数据

将sql行转换为单行多列数据,sql,Sql,我在表中有这个结构 TYPE DATE AMOUNT ID -------------------------------- B 30.6.2019 15 1 B 30.11.2019 20 1 C 22.12.2019 17 1 B 30.6.2019 15 2 B 30.11.2019 20 2 C

我在表中有这个结构

TYPE    DATE        AMOUNT  ID
--------------------------------
B       30.6.2019   15       1
B       30.11.2019  20       1      
C       22.12.2019  17       1  
B       30.6.2019   15       2
B       30.11.2019  20       2      
C       22.12.2019  17       2 
我需要一行多列的平面结构

TYPE1 DATE1     AMOUNT1 TYPE2 DATE2      AMOUNT2 TYPE3 DATE3      AMOUNT3      ID
-----------------------------------------------------------------------------------
B     30.6.2019 15      B     30.11.2019 20      C     22.12.2019 17             1
B     30.6.2019 15      B     30.11.2019 20      C     22.12.2019 17             2

请帮助查询。

我们可以在
行号的帮助下尝试pivot查询:

WITH cte AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY "DATE") rn
    FROM yourTable t
)

SELECT
    MAX(CASE WHEN rn = 1 THEN TYPE   END) AS TYPE1,
    MAX(CASE WHEN rn = 1 THEN "DATE" END) AS DATE1,
    MAX(CASE WHEN rn = 1 THEN AMOUNT END) AS AMOUNT1,
    MAX(CASE WHEN rn = 2 THEN TYPE   END) AS TYPE2,
    MAX(CASE WHEN rn = 2 THEN "DATE" END) AS DATE2,
    MAX(CASE WHEN rn = 2 THEN AMOUNT END) AS AMOUNT2,
    MAX(CASE WHEN rn = 3 THEN TYPE   END) AS TYPE3,
    MAX(CASE WHEN rn = 3 THEN "DATE" END) AS DATE3,
    MAX(CASE WHEN rn = 3 THEN AMOUNT END) AS AMOUNT3,
    ID
FROM cte
GROUP BY
    ID
ORDER BY
    ID;

在Oracle中,可以按如下方式使用
PIVOT

SQL> -- Sample data
SQL> WITH YOUR_TABLE(TYPE,"DATE",AMOUNT,ID) AS
  2  (
  3  SELECT 'B',       TO_DATE('30.06.2019','DD.MM.RRRR'),   15,       1 FROM DUAL UNION ALL
  4  SELECT 'B',       TO_DATE('30.11.2019','DD.MM.RRRR'),   20,       1 FROM DUAL UNION ALL
  5  SELECT 'C',       TO_DATE('22.12.2019','DD.MM.RRRR'),   17,       1 FROM DUAL UNION ALL
  6  SELECT 'B',       TO_DATE('30.06.2019','DD.MM.RRRR'),   15,       2 FROM DUAL UNION ALL
  7  SELECT 'B',       TO_DATE('30.11.2019','DD.MM.RRRR'),   20,       2 FROM DUAL UNION ALL
  8  SELECT 'C',       TO_DATE('22.12.2019','DD.MM.RRRR'),   17,       2 FROM DUAL )
  9  -- Your query starts from here
 10  SELECT * FROM (
 11  SELECT T.*,
 12         ROW_NUMBER() OVER(PARTITION BY ID ORDER BY "DATE") AS RN
 13    FROM YOUR_TABLE T
 14  ) PIVOT (
 15  MAX ( TYPE ) AS TYPE, MAX ( "DATE" ) AS "DATE", MAX ( AMOUNT ) AS AMOUNT
 16  FOR RN IN ( 1, 2, 3 )
 17  );

        ID 1 1_DATE      1_AMOUNT 2 2_DATE      2_AMOUNT 3 3_DATE      3_AMOUNT
---------- - --------- ---------- - --------- ---------- - --------- ----------
         1 B 30-JUN-19         15 B 30-NOV-19         20 C 22-DEC-19         17
         2 B 30-JUN-19         15 B 30-NOV-19         20 C 22-DEC-19         17

SQL>

请有人能帮上忙吗QueryTracle和mysql是两种不同的数据库产品,请用您实际使用的数据库产品来标记您的问题!嗨,这没用。它总是以类型1 AMOUNT1和日期1给出输出。我不同意你的评论。我的答案应该对你有用。谢谢。我稍微调整了一下。这对我有用。非常感谢。谢谢,也同样感谢你。我核对了答案你能帮我做这个吗?[{“clientId”:165,“price”:125},{“clientId”:180,“price”:200}]我想要一个oracle查询,在那里我可以根据clientId获取clientprice。例如,如果clientid=165,则价格为。