TSQL Вопрос: Группировка по нескольким столбцам - PullRequest
0 голосов
/ 31 января 2011

У меня есть таблица с несколькими столбцами, которые представляют случаи действия.

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. Я хочу получить количество групп "тип, значение".

Счет, который у меня был ранее, был неправильным ... Я хочу, чтобы отдельные клиенты имели определенное действие, а не количество определенных действий. Таким образом, значение I-A должно быть равно 4, используя приведенную выше видимую таблицу.

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

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Предполагая, что SQL 2005 или выше, вы можете использовать UNPIVOT , а затем выполнять GROUP BYS и COUNTs

1 голос
/ 31 января 2011

У вас есть возможность поместить эту таблицу в первую нормальную форму и разбить эти повторяющиеся столбцы на дочернюю таблицу?Потому что, если мы отбросим теорию о том, почему 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

Если вы хотите запросить несколько значений, а не только «A», вы должны повернуть таблицу в запросе, который включает в себя около 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
...