Сумасшедший вопрос по SQL:Как сделать своего рода перекрестное применение с опорной точкой?

StackOverflow https://stackoverflow.com/questions/1691326

  •  18-09-2019
  •  | 
  •  

Вопрос

У клиента есть ярлыки в своих данных, где у него есть количество записей в поле.Когда я их анализирую, мне нужно создать записи, по одной для каждого количества, увеличивая «идентификатор» на 7 дней (поскольку число представляет дату.

Пример:один продукт продается в течение четырех недель, и мне нужно четыре записи, по одному продукту на каждую неделю.

[Номер события] [Классификация] [Недели идут] [Некоторые данные]
 2009 11 29 00           1                   1        продлится одну неделю
 2009 12 06 00           2                   1        продлится одну неделю
 2009 12 13 00           1                   4        продлится четыре недели
 2009 12 20 00           2                   4        продлится четыре недели

Каким-то образом мне нужно превратить эти данные в следующее с помощью представления (sql select) (все в одной таблице, пробелы включены для просмотра частей:

[Номер события + Классификация] [Некоторые данные]
          2009 11 29 01           работает одну неделю Одна неделя, таким образом, один рекорд.
          2009 12 06 02           работает одну неделю

          2009 12 13 01           работает четыре недели Повторяется 4 раза, увеличивая дату на 7.
          2009 12 20 01           работает четыре недели
          2009 12 27 01           работает четыре недели
          2009 01 03 01           работает четыре недели

          2009 12 20 02           работает четыре недели Повторяется 4 раза, увеличивая дату на 7.
          2009 12 27 02           работает четыре недели
          2009 01 03 02           работает четыре недели
          2009 01 10 02           работает четыре недели

Я думаю, что нужно использовать какой-то сводный перекрестный код SQL?

Это было полезно?

Решение

У меня есть для вас дешевый ответ.Вы используете «предварительно отрендеренный» Weeks table для создания цикла на основе запроса.Вам потребуется потратить на это достаточно недель, чтобы охватить ожидаемый диапазон сценариев.

[Week]
1
2
3
4

Затем вы присоединяетесь к своему запросу на [Weeks Running] к этой таблице, используя неравенство OriginalTable.WeeksRunning <= Weeks.Week.В итоге у вас получится одна строка в неделю.

Вы определяете дату, добавляя Weeks.Week * 7 дней до даты, указанной в номере вашего мероприятия.

Другие советы

Вероятно, это будет проще сделать на стороне приложения, а не на стороне базы данных, но я попробую...Для этого требуется база данных, поддерживающая CTE, которой у меня нет под рукой, поэтому это не проверено.

WITH RECURSIVE expandedTable(eventNumber, classification, index, count, someData)
AS (
    SELECT eventNumber, classification, 1, weeksRunning, someData
    FROM originalTable
    WHERE weeksRunning > 0
  UNION ALL
    SELECT eventNumber + 7, classification, index + 1, count, someData
    FROM expandedTable
    WHERE index < count
)
SELECT eventNumber, classification, someData
FROM expandedTable;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top