Как сгруппировать столбцы в таблице sql для подсчета - PullRequest
2 голосов
/ 11 июля 2011

Я не уверен, что для этого есть простая концепция или шаблон, поэтому мне просто нужно это описать.

Допустим, у меня есть такая таблица:

CallID (uniqueidentifier)
CallDateTime (datetime)
CallIssue (varchar(100))
Pollution (bit)
Violation (bit)
Accident (bit)
General (bit)

И я хочу получить счет в отчете.Для 30 различных вызовов счет будет выглядеть следующим образом:

Pollution: 4
Violation: 3
Accident: 2
General: 7
Pollution & Violation: 5
Pollution & Accident: 9

То, что происходит, заключается в том, что если бы для вызова были установлены оба параметра: «Загрязнение» и «Нарушение», они учитывались бы отдельно, чем вызовы, имеющие только «Загрязнение» или «Нарушение».

Есть ли способ, кроме курсора, чтобы я мог это сделать?

Мы используем SQL 2005.

Ответы [ 3 ]

1 голос
/ 11 июля 2011

Примерно так могли бы подсчитать за вас.

select sum(case Pollution when 1 then 1 else 0 end) as Pollution,
       sum(case Violation when 1 then 1 else 0 end) as Violation,
       sum(case Accident when 1 then 1 else 0 end) as Accident,
       sum(case General when 1 then 1 else 0 end) as General,
       sum(case when Pollution = 1 and Violation = 1 then 1 else 0 end) [Pollution & Violation],
       sum(case when Pollution = 1 and Accident = 1 then 1 else 0 end) [Pollution & Accident]
from YourTable
0 голосов
/ 11 июля 2011

Простое выполнение GROUP BY pollution, violation, accident, general должно дать вам накопления так, как вы хотите (что вы можете сделать count(*) из). Затем вы можете прочитать сгруппированные столбцы, чтобы выяснить, на какой накопительный пакет вы ссылаетесь.
Обратите внимание, что если вы ожидаете получить это в какой-то программе отображения, курсор может потребоваться в любом случае - однако, почти во всех случаях агрегация и сортировка должны выполняться на уровне базы данных.

Вот пример запроса:

SELECT pollution, violation, accident, general, count(*)
FROM callTable
GROUP BY pollution, violation, accident, general  

Затем можно выполнить такие действия, как установка дисплея на «Загрязнение и нарушение» - в коде приложения - путем проверки, установлен ли соответствующий битовый столбец на «1» или как-то еще, и отображения счетчика.

0 голосов
/ 11 июля 2011

Я не гуру SQL, но с головы до ног

SELECT 
    SUM(CASE WHEN Pollution= 1 THEN 1 ELSE 0 END) AS Pollution, 
    SUM(CASE WHEN Violation= 1 THEN 1 ELSE 0 END) AS Violation, 
    SUM(CASE WHEN Accident= 1 THEN 1 ELSE 0 END) AS Accident,
    SUM(CASE WHEN Pollution & Violation= 1 THEN 1 ELSE 0 END) AS [Pollution_And_Violation], 
    SUM(CASE WHEN Pollution & Accident= 1 THEN 1 ELSE 0 END) AS [Pollution_And_Accident], 
FROM
dbo.Table

РЕДАКТИРОВАТЬ:

Так же, как Микаэль, только с использованием побитовых операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...