Я прочитал материал в сводных таблицах MS, и у меня все еще есть проблемы с получением этого правильного.
У меня есть временная таблица, которая создается, мы скажем, что столбец 1 - это номер магазина, а столбец 2 - номер недели, и, наконец, столбец 3 - это итог какого-то типа. Также номера недель являются динамическими, номера магазинов являются статическими.
Store Week xCount
------- ---- ------
102 1 96
101 1 138
105 1 37
109 1 59
101 2 282
102 2 212
105 2 78
109 2 97
105 3 60
102 3 123
101 3 220
109 3 87
Я хотел бы, чтобы это вышло как сводная таблица, вот так:
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
Храните числа внизу и недели сверху.
Ответы:
Если вы используете SQL Server 2005+, то можете использовать
PIVOT
функцию для преобразования данных из строк в столбцы.Похоже, вам нужно будет использовать динамический sql, если недели неизвестны, но легче сначала увидеть правильный код, используя жестко запрограммированную версию.
Прежде всего, вот несколько быстрых определений таблиц и данных для использования:
Если ваши значения известны, то вы жестко закодируете запрос:
Посмотреть SQL Demo
Тогда, если вам нужно динамически сгенерировать номер недели, ваш код будет:
Видеть SQL Demo .
Динамическая версия, генерирует список
week
чисел, которые должны быть преобразованы в столбцы. Оба дают одинаковый результат:источник
cte3 AS (select ... )
тогда у вас есть определенная выше логика с@cols
и@query
... есть ошибка. Неверное имя объекта "cte3". как это исправить. -STUFF(...)
раньше (или то иXML PATH
другое). Для удобства других читателей все, что делается, - это объединение имен столбцов и отрывание запятой. Примечание. Мне кажется, что следующее немного проще: выберите @cols = (SELECT DISTINCT QUOTENAME (Week) + ',' в следующем порядке: 1 FOR XML PATH ('')) set @cols = SUBSTRING (@cols, 1, LEN ( @cols) - 1) ... заменаgroup by
наdistinct
иorder by 1
вручную рубить с суффиксом запятой!Это для динамического количества недель.
Полный пример здесь: SQL Dynamic Pivot
источник
Я достиг того же самого прежде, используя подзапросы. Таким образом, если ваша исходная таблица называлась StoreCountsByWeek, и у вас была отдельная таблица, в которой перечислены идентификаторы магазина, то она будет выглядеть следующим образом:
Одним из преимуществ этого метода является то, что синтаксис более понятен, и он облегчает объединение с другими таблицами для включения других полей в результаты.
По моим неподтвержденным результатам, выполнение этого запроса для нескольких тысяч строк завершилось менее чем за одну секунду, и у меня фактически было 7 подзапросов. Но, как отмечается в комментариях, таким способом в вычислительном отношении это обходится дороже, поэтому будьте осторожны при использовании этого метода, если ожидаете, что он будет работать на больших объемах данных.
источник
Вот что вы можете сделать:
DEMO
источник
Я пишу sp, который может быть полезен для этой цели, в основном это sp pivot любой таблицы и возвращает новую таблицу pivoted или возвращает только набор данных, это способ ее выполнения:
обратите внимание, что в параметре @agg имена столбцов должны быть с
'['
а параметр должен заканчиваться запятой','
SP
Это пример выполнения:
тогда
Select * From ##TEMPORAL1PVT
вернется:источник
источник
Вот пересмотренный ответ @Tayrn выше, который может помочь вам немного легче понять поворот:
Возможно, это не лучший способ сделать это, но именно это помогло мне обернуться, как поворачивать столы.
ID = строки, которые вы хотите повернуть
MY_KEY = столбец, который вы выбираете из исходной таблицы и который содержит имена столбцов, которые вы хотите изменить.
VAL = значение, которое вы хотите вернуть под каждым столбцом.
MAX (VAL) => Может быть заменен другими агрегатными функциями. Сумма (VAL), MIN (VAL), ETC ...
источник
Просто дайте вам некоторое представление о том, как другие базы данных решают эту проблему.
DolphinDB
также имеет встроенную поддержку для поворота и SQL выглядит гораздо более интуитивно понятным и аккуратным. Это так же просто, как указание ключевого столбца (Store
), поворотного столбца (Week
) и вычисленной метрики (sum(xCount)
).DolphinDB - это колоночная высокопроизводительная база данных. Расчет в демоверсии стоит всего 546 мс на ноутбуке dell xps (i7 cpu). Для получения более подробной информации, пожалуйста, обратитесь к онлайн-руководству DolphinDB https://www.dolphindb.com/help/index.html?pivotby.html.
источник