Как построить сводку, присоединившись к одной таблице с помощью SQL Server? - PullRequest
0 голосов
/ 27 июля 2011

У меня есть таблица, которая обновляется, имеет несколько полей с повторяющимися данными.Я хочу свернуть эти данные, чтобы подвести итог.Как мне сделать это для SQL Server?У меня есть пример вывода и структуры ниже.Я пробовал несколько разных объединений, но видел повторяющиеся данные и некоторые ошибки, которые я не понимаю.

Структура таблицы

  • Имя файла журнала (строка)
  • Состояние (целое) - может быть 1, 2, 3 в зависимости от ввода приложения

Данные

f1, 3, 0
f1, 2, 1
f1, 3, 0
f2, 1, 1
f2, 1, 1
f2, 2, 1
....

Вывод

File | Count of status == 1 | Count of status == 2 
f1   | 59                  | 43
f2   | 28                  | 99
f3   | 23                  | 16

Ответы [ 3 ]

2 голосов
/ 27 июля 2011

Предполагается, что вы используете SQL Server 2005 или выше, вот код:

DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)

SELECT  @cols = STUFF(( SELECT distinct  ',' + QuoteName(cast([status] as varchar))
                        FROM LogTable FOR XML PATH('') ), 1, 1, '') 


SET @sqlquery = 'SELECT * FROM
      (SELECT UserIndex,  [status]
       FROM LogTable ) base
       PIVOT (Count(status) FOR [status]
       IN (' + @cols + ')) AS finalpivot'

EXECUTE ( @sqlquery )

Это будет работать независимо от того, сколько у вас разных статусов.Он динамически собирает запрос с помощью PIVOT.

Обновление

Как указал @JonH, в опубликованном мною коде была уязвимость, которая сделала возможным внедрениеатака.Теперь это исправлено с помощью QUOTENAME при формировании имен столбцов.

Другие примеры:

0 голосов
/ 27 июля 2011
SELECT 
    file,
    SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS [Count of status == 1] ,
    SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS [Count of status == 2] 
FROM Table 
GROUP BY file 
ORDER BY file 
0 голосов
/ 27 июля 2011

Суммируйте данные, используя накопительный пакет:

http://msdn.microsoft.com/en-us/library/ms189305(v=sql.90).aspx

Какую версию сервера sql вы используете?

Если вы не хотите использовать накопительный пакет, это должно помочь:

SELECT
      FileName,
      SUM(CASE WHEN Status = 1 THEN 1 ELSE 0 END) AS CountOf1,
      SUM(CASE WHEN Status = 2 THEN 1 ELSE 0 END) AS CountOf2,
      SUM(CASE WHEN Status = 3 THEN 1 ELSE 0 END) AS CountOf3
FROM
      MyTable
GROUP BY FileName
ORDER BY FileName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...