Mysql

將列結果集轉換為 MySQL 中的獨立行

  • August 24, 2020

我對此很陌生,並且一直在為一個問題而苦苦掙扎。

我有一個結果集,它為表中的每個機會(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<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/274183