TSQL Вопрос: группа по нескольким столбцам
-
27-10-2019 - |
Вопрос
У меня есть таблица с несколькими столбцами, которые представляют возникновение действия.
SimpleTableExample
id type $$$$$ value1 value2 value3 ... value15
-- ---- -- ----- ----- ----- -----
1 "I" 1 "a" "b" "" ""
2 "O" 1 "a" "d" "f" "z"
3 "I" 1 "d" "b" "" ""
4 "O" 1 "g" "l" "" ""
5 "I" 1 "z" "g" "a" ""
6 "I" 1 "z" "g" "a" "a"
Не совсем уверен, как представить данные, но вышеупомянутое должно показать их ... на строку, у меня есть несколько столбцов, которые я хочу сгруппировать. Сосредоточившись на части «А», я бы хотел результат такой, что:
Type Value Count Sum
----- ----- ----- ---
"I" "A" "3" 3
"O" "A" "2" 1
Просто не уверен, как пойти или даже наилучшим образом, чтобы группировать с несколькими столбцами. Если бы это был «высокий» таблицу с номером последовательности, это будет щелчок ...
Одна вещь, о которой я беспокоюсь ... если у меня есть одинаковое значение в нескольких рядах (у них одно и то же действие, выполненное несколько раз), и я складываю столбцы и пытаюсь суммировать строки. Так, например, ряд 6 имеет 3 и 15 со значением a, и я стараюсь суммировать () итоги этой группы, я не хочу, чтобы 6 подсчитано дважды (показано выше
Редактировать: Пытаюсь уточнить здесь ... у меня есть ряд клиентов с «действиями». Действия переполнены в значение1 через значение15. Я хочу получить подсчет групп «типа, стоимость».
Граф, который у меня был ранее, был неправильным ... Я хочу, чтобы у разных клиентов были определенные действия, а не количество определенных действий. Таким образом, IA должен быть 4 -м счетом, используя приведенную выше видимую таблицу.
Заключительная примечаниеОбзор кода Вопрос о том, что я придумал. Освободите, чтобы составить список уникальных пар дат/значения.
Решение
Предполагая SQL 2005 или выше, вы можете использовать Раскрыть а затем сделайте свою группу и считает
Другие советы
У вас есть возможность поместить эту таблицу в первую нормальную форму и разбить эти повторные столбцы на дочернюю таблицу? Потому что, если мы откладываем в сторону теорию того, почему 1NF хороша, практическая реальность такова, что ненормализованные примеры, подобные этому, делают простые вопросы жесткими.
С учетом вышесказанного, если вы застряли в этой ненормализованной таблице, вы должны кодировать что-то вроде этого:
select type
, 'A' as Column2
, sum(case when value1='A' or value2='A' or.....
then 1 else 0 end) as theCount
from theTable
group by type
Если вы хотите запрашивать несколько значений, а не только «а», вы должны разворачивать таблицу в запросе, в котором участвуют около 15 профсоюзов:
select type,value,count(*) from (
select type,value1 as value from theTable
union all
select type,value2 as value from theTable
union all
select type,value3 as value from theTable
...and so on...
) x
group by type,value