将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,则价格为。