Mysql
將列結果集轉換為 MySQL 中的獨立行
我對此很陌生,並且一直在為一個問題而苦苦掙扎。
我有一個結果集,它為表中的每個機會(id 作為主鍵)提供第一個現金流量(DFCFW)的日期作為一列,接下來的 10 個列(CFW1、CFW2、….、CFW10)是未來 10 年每年的 10 種可能的現金流量,預計為第一個現金流量的周年日。
我想創建一個視圖,為所有機會顯示三列:opportunity.id、現金流日期、現金流;每個機會應該有 10 條記錄。
任何建議如何實現這一目標?
非常感謝
弗雷德
為了增加一些清晰度:
我今天的樣子是這樣的:
不幸的是,MySQL沒有在這種情況下非常方便的
UNPIVOT
運算符 - 恐怕您只需要捲起袖子手動操作即可。看這裡的小提琴——我只做了 3CFW
秒——你可以複製和粘貼剩下的。CREATE TABLE example ( opp_id INTEGER NOT NULL PRIMARY KEY, region VARCHAR (10) NOT NULL, first_cfw DATE NOT NULL, cfw1 INTEGER NOT NULL, cfw2 INTEGER NOT NULL, cfw3 INTEGER NOT NULL );
填充它:
INSERT INTO example VALUES (1, 'Europe', '2020-06-01', 100, 100, 100), (2, 'USA', '2020-02-01', 200, 200, 200), (3, 'Europe', '2017-10-01', 150, 150, 150);
然後執行:
SELECT opp_id, region, first_cfw AS the_date, cfw1 AS cost_fw FROM example UNION ALL SELECT opp_id, region, DATE_ADD(first_cfw, INTERVAL 1 YEAR), cfw2 FROM example UNION ALL SELECT opp_id, region, DATE_ADD(first_cfw, INTERVAL 2 YEAR), cfw3 FROM example ORDER BY opp_id, region, the_date ASC
結果:
opp_id region the_date cost_fw 1 Europe 2020-06-01 100 1 Europe 2021-06-01 100 1 Europe 2022-06-01 100 2 USA 2020-02-01 200 2 USA 2021-02-01 200 2 USA 2022-02-01 200 3 Europe 2017-10-01 150 3 Europe 2018-10-01 150 3 Europe 2019-10-01 150
我同意那些建議您應該考慮重新設計架構的評論 - 您的主架構應該看起來像最終結果。根據經驗,桌子應該又高又瘦,而不是又短又胖!
正如我在評論中提到的那樣,將數據保存在 for,m 中會導致問題
還要將日期始終保存在 mysql date_form 中,否則您必須始終轉換它們
這表明你是在沒有動態 sql 的情況下完成的,如果你有 100 個這樣的列,你必須使用 INFORMTION_SCHEMA 來獲取所有列,但基本上你和例子中的一樣。
當然,您必須自己添加 tghe rst,tpo 如何獲得所有 10 列是非常明顯的
CREATE TABLE table1 ( `Opp_id` INT, `REgion` VARCHAR(8), `date1erCFW` VARCHAR(10), `CFW1`INTEGER, `CFW2` INTEGER, `CFW3` INTEGER, `CFW4` INTEGER, `CFW5` INTEGER, `CFW6` INTEGER, `CFW7` INTEGER, `CFWB` INTEGER, `CFW9` INTEGER, `CFW1O` INTEGER );
INSERT INTO table1 (`Opp_id`, `Region`, `date1erCFW`, `CFW1`, `CFW2`, `CFW3`, `CFW4`, `CFW5`, `CFW6`, `CFW7`, `CFWB`, `CFW9`, `CFW1O`) VALUES ('1', 'Europe', '01/06/2020', '100', '100', '100', '100', '100', '100', '100', '0', '0', '0'), ('2', 'USA', '01/02/2020', '200', '200', '200', '200', '200', '200', '200', '200', '200', '0'), ('3', 'Europe', '01/10/2017', '150', '150', '150', '150', '150', '150', '150', '150', '150', '150');
SELECT `Opp_id`, `Region`, `date1erCFW`, `CFW1` FROM table1 UNION SELECT `Opp_id`, `Region`, DATE_FORMAT(STR_TO_DATE(`date1erCFW`,'%d/%m/%Y') + INTERVAL 1 YEAR,'%d/%m/%Y'), `CFW2` FROM table1 UNION SELECT `Opp_id`, `Region`, DATE_FORMAT(STR_TO_DATE(`date1erCFW`,'%d/%m/%Y') + INTERVAL 2 YEAR,'%d/%m/%Y'), `CFW3` FROM table1 UNION SELECT `Opp_id`, `Region`, DATE_FORMAT(STR_TO_DATE(`date1erCFW`,'%d/%m/%Y') + INTERVAL 3 YEAR,'%d/%m/%Y'), `CFW5` FROM table1 UNION SELECT `Opp_id`, `Region`, DATE_FORMAT(STR_TO_DATE(`date1erCFW`,'%d/%m/%Y') + INTERVAL 4 YEAR,'%d/%m/%Y'), `CFW6` FROM table1 ORDER BY `Opp_id`, STR_TO_DATE(`date1erCFW`,'%d/%m/%Y')
Opp_id | 地區 | date1erCFW | CFW1 -----: | :----- | :--------- | ---: 1 | 歐洲 | 2020 年 1 月 6 日 | 100 1 | 歐洲 | 2021 年 1 月 6 日 | 100 1 | 歐洲 | 2022 年 1 月 6 日 | 100 1 | 歐洲 | 2023 年 1 月 6 日 | 100 1 | 歐洲 | 2024 年 1 月 6 日 | 100 2 | 美國 | 2020 年 1 月 2 日 | 200 2 | 美國 | 2021 年 1 月 2 日 | 200 2 | 美國 | 2022 年 1 月 2 日 | 200 2 | 美國 | 2023 年 1 月 2 日 | 200 2 | 美國 | 2024 年 1 月 2 日 | 200 3 | 歐洲 | 2017 年 1 月 10 日 | 150 3 | 歐洲 | 2018 年 1 月 10 日 | 150 3 | 歐洲 | 2019 年 1 月 10 日 | 150 3 | 歐洲 | 2020 年 1 月 10 日 | 150 3 | 歐洲 | 2021 年 1 月 10 日 | 150
db<>在這裡擺弄