#sql #oracle
Вопрос:
У меня есть две таблицы, таблица сортировки и таблица назначения
Сортировка | Имя |
---|---|
0 | A |
1 | B |
2 | C |
3 | D |
Я хочу назначить миссию всем, начните со специального примера сортировки: начните с сортировки 2 и измените порядок на следующей неделе. результат, как показано ниже:
Дата | Неделя | МиссионА | Миссия B | Миссия | Миссия |
---|---|---|---|---|---|
2021/1/3 | 1 | C | D | A | B |
2021/1/4 | 1 | C | D | A | B |
2021/1/5 | 1 | C | D | A | B |
2021/1/6 | 1 | C | D | A | B |
2021/1/7 | 1 | C | D | A | B |
2021/1/8 | 1 | C | D | A | B |
2021/1/9 | 1 | C | D | A | B |
2021/1/10 | 2 | D | A | B | C |
2021/1/11 | 2 | D | A | B | C |
Комментарии:
1. Можете ли вы показать нам, что вы пытались решить эту проблему
2. мы действительно не сможем вам помочь, если вы не укажете здесь свою проблему. Какую базу данных вы используете?
3. @Carlo Прато: Очевидно, что СУБД является Oracle, и база данных, вероятно, принадлежит ему. Вы хотите знать, как выглядит таблица назначений? Я тоже 🙂
4. Пожалуйста, покажите свою таблицу назначения. Или результат, который вы показываете, чем должна быть заполнена таблица назначений? Откуда у тебя столько дней? Вы хотите, чтобы они были сгенерированы? Откуда у вас такое количество миссий? Это просто количество записей в таблице сортировки?
5. извините всех, я не совсем ясно выразился. Я новичок в oracle sql. MT0 ответь на мой вопрос, и я знаю, как это сделать, спасибо всем ^^
Ответ №1:
Если вы не знаете количество строк в sorts
таблице, то вы можете сгенерировать значения в виде строк (вместо столбцов):
SELECT d.dt,
d.week,
MOD(d.week s.sortid, s.num_sorts) AS mission,
s.name
FROM (
SELECT DATE '2021-01-02' LEVEL AS dt,
CEIL(LEVEL / 7) AS week
FROM DUAL
CONNECT BY LEVEL <= 9
) d
CROSS JOIN (
SELECT sortid,
name,
COUNT(*) OVER() AS num_sorts
FROM sorts
) s
Который, для выборочных данных:
CREATE TABLE sorts (SortID, Name) AS
SELECT 0, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'C' FROM DUAL UNION ALL
SELECT 3, 'D' FROM DUAL;
Выходы:
dt неделя миссия Имя 03-21 ЯНВАРЯ 1 1 A 03-21 ЯНВАРЯ 1 2 B 03-21 ЯНВАРЯ 1 3 C 03-21 ЯНВАРЯ 1 0 D 04-21 ЯНВАРЯ 1 1 A 04-21 ЯНВАРЯ 1 2 B 04-21 ЯНВАРЯ 1 3 C 04-21 ЯНВАРЯ 1 0 D 05-21 ЯНВАРЯ 1 1 A 05-21 ЯНВАРЯ 1 2 B 05-21 ЯНВАРЯ 1 3 C 05-21 ЯНВАРЯ 1 0 D 06-21 ЯНВАРЯ 1 1 A 06-21 ЯНВАРЯ 1 2 B 06-21 ЯНВАРЯ 1 3 C 06-21 ЯНВАРЯ 1 0 D 07-21 ЯНВАРЯ 1 1 A 07-21 ЯНВАРЯ 1 2 B 07-21 ЯНВАРЯ 1 3 C 07-21 ЯНВАРЯ 1 0 D 08-21 ЯНВАРЯ 1 1 A 08-21 ЯНВАРЯ 1 2 B 08-21 ЯНВАРЯ 1 3 C 08-21 ЯНВАРЯ 1 0 D 09-21 ЯНВАРЯ 1 1 A 09-21 ЯНВАРЯ 1 2 B 09-21 ЯНВАРЯ 1 3 C 09-21 ЯНВАРЯ 1 0 D 10-21 ЯНВАРЯ 2 2 A 10-21 ЯНВАРЯ 2 3 B 10-21 ЯНВАРЯ 2 0 C 10-21 ЯНВАРЯ 2 1 D 11-21 ЯНВАРЯ 2 2 A 11-21 ЯНВАРЯ 2 3 B 11-21 ЯНВАРЯ 2 0 C 11-21 ЯНВАРЯ 2 1 D
Примечание: Если вы не знаете, сколько столбцов будет на выходе, очень сложно PIVOT
преобразовать столбцы в строки, так как SQL (не только Oracle) не поддерживает динамический поворот. Преобразование динамических данных в столбцы, как правило, выполняется в приложении среднего уровня (PHP, Java, C#, Python и т.д.).
Если вам известно количество строк в sorts
таблице, вы можете использовать условное агрегирование для преобразования столбцов в строки:
SELECT d.dt,
d.week,
MAX(
CASE MOD(4 MOD(3 s.sortid - d.week, 4), 4)
WHEN 0
THEN s.name
END
) AS missionA,
MAX(
CASE MOD(4 MOD(3 s.sortid - d.week, 4), 4)
WHEN 1
THEN s.name
END
) AS missionB,
MAX(
CASE MOD(4 MOD(3 s.sortid - d.week, 4), 4)
WHEN 2
THEN s.name
END
) AS missionC,
MAX(
CASE MOD(4 MOD(3 s.sortid - d.week, 4), 4)
WHEN 3
THEN s.name
END
) AS missionD
FROM (
SELECT DATE '2021-01-02' LEVEL AS dt,
CEIL(LEVEL / 7) AS week
FROM DUAL
CONNECT BY LEVEL <= 9
) d
CROSS JOIN sorts s
GROUP BY dt, week
ORDER BY dt
Какие результаты:
dt неделя МИССИОНА МИССИЯ B МИССИЯ МИССИЯ 03-21 ЯНВАРЯ 1 C D A B 04-21 ЯНВАРЯ 1 C D A B 05-21 ЯНВАРЯ 1 C D A B 06-21 ЯНВАРЯ 1 C D A B 07-21 ЯНВАРЯ 1 C D A B 08-21 ЯНВАРЯ 1 C D A B 09-21 ЯНВАРЯ 1 C D A B 10-21 ЯНВАРЯ 2 D A B C 11-21 ЯНВАРЯ 2 D A B C
бд<>скрипка <>здесь