Как создать несколько строк из условий столбцов в одной строке в SQL - PullRequest
0 голосов
/ 17 июня 2020

Я новичок в SQl и пытаюсь найти решение.

Как мне получить эти данные

Index1 From_date To_date
A       2001      2003
B       2005      2007

на

Index1 Year
A       2001
A       2002
A       2003
B       2005
B       2006
B       2007

Ответы [ 3 ]

0 голосов
/ 17 июня 2020

Вы можете использовать объединение с двумя операторами select:

(SELECT index1, from_date as date FROM table)
UNION
(SELECT index1, to_date as date FROM table);

Здесь это как у вас:

first table      |    second table
                 |
Index1  date     |    Index1  date
A       2001     |    A       2003
B       2005     |    B       2007

И вы можете добавить порядок:

(SELECT index1, from_date as date FROM table)
UNION
(SELECT index1, to_date as date FROM table)
ORDER BY index1 ASC;

https://www.mysqltutorial.org/sql-union-mysql.aspx

0 голосов
/ 17 июня 2020

Это очень хороший пример использования рекурсивных CTE:

with recursive cte as (
      select index1, from_date, to_date
      from t
      union all
      select index1, from_date + 1, to_date
      from cte
      where from_date < to_date
     )
select index1, from_date
from cte;

Здесь - скрипт db <>.

0 голосов
/ 17 июня 2020

Создание теста:

CREATE TABLE letter (letter VARCHAR(1) PRIMARY KEY, from_date INT, to_date INT);
INSERT INTO letter VALUES ("A", 2001, 2003), ("B", 2005, 2007);

Выбор необходимого:

SELECT letter.letter, t1.f1 + t2.f1 * 10 + 2000 as yr
FROM letter
CROSS JOIN (
    SELECT 0 f1 UNION ALL SELECT 1 f1 UNION ALL SELECT 2 f1 UNION ALL SELECT 3 f1 UNION ALL SELECT 4 f1 UNION ALL SELECT 5 f1 UNION ALL SELECT 6 f1 UNION ALL SELECT 7 f1 UNION ALL SELECT 8 f1 UNION ALL SELECT 18 f1) t1
CROSS JOIN
    (SELECT 0 f1 UNION ALL SELECT 1 f1 UNION ALL SELECT 2 f1 UNION ALL SELECT 3 f1 UNION ALL SELECT 4 f1 UNION ALL SELECT 5 f1 UNION ALL SELECT 6 f1 UNION ALL SELECT 7 f1 UNION ALL SELECT 8 f1 UNION ALL SELECT 18 f1) t2
WHERE t1.f1 + t2.f1 * 100 + 2000 between letter.from_date and letter.to_date;

Результат

A   2001
A   2002
A   2003
B   2005
B   2006
B   2007

Охватываются годы между 2000 и 2099 годами. Если нужно больше - добавьте еще t таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...