Как я могу выполнить Pivot-запрос в диапазоне чисел и сортировать результаты?

Я ищу запрос MS SQL (для использования в SQL Reporting Services), чтобы дать мне следующий результат:

JobCode 0-10 11-20 21-30 31-40 41-50 A 1 2 0 0 2 B 0 2 2 0 0 C 3 0 1 1 0 

Текущий запрос:

 SELECT RecordID , CAST(GETDATE() - JobStartDate AS Int) AS DaysSinceStart , Code FROM tblJobs 

Возвращает эти результаты:

 RecordID | DaysSinceStart | Code 158987 11 A 158968 3 A 158972 4 C 158973 16 B 158974 23 C 158975 13 B 158976 45 A 158977 32 C 158985 9 C 158981 25 B 158982 47 A 158983 18 A 158978 5 C 158979 27 B 

Я могу использовать следующее, чтобы вернуть общее резюме, но не позволяет мне просматривать отдельные результаты по JobCode:

 SELECT Range AS [Day Range], COUNT(*) AS Jobs FROM (SELECT CASE WHEN DaysSinceStart BETWEEN 0 AND 9 THEN ' 0- 9' WHEN DaysSinceStart BETWEEN 10 AND 19 THEN '10-19' WHEN DaysSinceStart BETWEEN 20 AND 29 THEN '20-29' WHEN DaysSinceStart BETWEEN 30 AND 39 THEN '30-39' WHEN DaysSinceStart BETWEEN 40 AND 49 THEN '40-49' WHEN DaysSinceStart BETWEEN 50 AND 59 THEN '50-59' WHEN DaysSinceStart BETWEEN 60 AND 69 THEN '60-69' WHEN DaysSinceStart BETWEEN 70 AND 79 THEN '70-79' WHEN DaysSinceStart BETWEEN 80 AND 89 THEN '80-89' WHEN DaysSinceStart BETWEEN 90 AND 99 THEN '90-99' ELSE 'Over 100' END AS Range FROM (SELECT DaysSinceStart FROM tblJobs) AS derivedtbl_1) AS t GROUP BY Range 

Может ли кто-нибудь помочь с получением разбивки по полю кода, пожалуйста? Спасибо заранее. PS Я использую MS SQL Server 2012

Попробуй это :

 select * from (SELECT code,Range AS [Day Range], COUNT(*) AS Jobs FROM (SELECT code,CASE WHEN DaysSinceStart BETWEEN 0 AND 9 THEN '0- 9' WHEN DaysSinceStart BETWEEN 10 AND 19 THEN '10-19' WHEN DaysSinceStart BETWEEN 20 AND 29 THEN '20-29' WHEN DaysSinceStart BETWEEN 30 AND 39 THEN '30-39' WHEN DaysSinceStart BETWEEN 40 AND 49 THEN '40-49' WHEN DaysSinceStart BETWEEN 50 AND 59 THEN '50-59' WHEN DaysSinceStart BETWEEN 60 AND 69 THEN '60-69' WHEN DaysSinceStart BETWEEN 70 AND 79 THEN '70-79' WHEN DaysSinceStart BETWEEN 80 AND 89 THEN '80-89' WHEN DaysSinceStart BETWEEN 90 AND 99 THEN '90-99' ELSE 'Over 100' END AS Range FROM (SELECT code,DaysSinceStart FROM demo) AS derivedtbl_1) AS t GROUP BY Range,code) q1 pivot (max(jobs) for [Day Range] in ([0- 9],[10-19],[20-29],[30-39],[40-49],[50-59], [60-69],[70-79],[80-89],[90-99],[Over 100]) )as pvt 

SQL Fiddle

Попробуй это –

Запрос:

 SET NOCOUNT ON; DECLARE @tblJobs TABLE ( RecordID INT , DaysSinceStart INT , Code CHAR(1) ) INSERT INTO @tblJobs (RecordID, DaysSinceStart, Code) VALUES (158987, 11, 'A'), (158968, 3, 'A'), (158972, 4, 'C'), (158973, 16, 'B'), (158974, 23, 'C'), (158975, 13, 'B'), (158976, 45, 'A'), (158977, 32, 'C'), (158985, 9, 'C'), (158981, 25, 'B'), (158982, 47, 'A'), (158983, 18, 'A'), (158978, 5, 'C'), (158979, 27, 'B') SELECT * FROM ( SELECT t.Code , [Range] = CASE WHEN DaysSinceStart BETWEEN 0 AND 9 THEN '0-9' WHEN DaysSinceStart BETWEEN 10 AND 19 THEN '10-19' WHEN DaysSinceStart BETWEEN 20 AND 29 THEN '20-29' WHEN DaysSinceStart BETWEEN 30 AND 39 THEN '30-39' WHEN DaysSinceStart BETWEEN 40 AND 49 THEN '40-49' WHEN DaysSinceStart BETWEEN 50 AND 59 THEN '50-59' WHEN DaysSinceStart BETWEEN 60 AND 69 THEN '60-69' WHEN DaysSinceStart BETWEEN 70 AND 79 THEN '70-79' WHEN DaysSinceStart BETWEEN 80 AND 89 THEN '80-89' WHEN DaysSinceStart BETWEEN 90 AND 99 THEN '90-99' ELSE 'Over 100' END FROM @tblJobs t ) o PIVOT ( COUNT(o.[Range]) FOR [Range] IN ( [0-9], [10-19], [20-29], [30-39], [40-49], [50-59], [60-69], [70-79], [80-89], [90-99], [Over 100] ) ) pt 

Вывод:

 Code 0-9 10-19 20-29 30-39 40-49 50-59 60-69 70-79 80-89 90-99 Over 100 ---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- A 1 2 0 0 2 0 0 0 0 0 0 B 0 2 2 0 0 0 0 0 0 0 0 C 3 0 1 1 0 0 0 0 0 0 0 

Создайте таблицу производных таблиц / CTE / table / temp или, возможно, таблицу, содержащую ваши интервалы. Используйте эту таблицу, чтобы присоединиться к JobStartDate между JobStartDate и getdate() чтобы получить интервал. Затем вы можете использовать pivot для подсчета значений для каждого Code и interval .

 with C(low, high, interval) as ( select 0, 10, '0-10' union all select 11, 20, '11-20' union all select 21, 30, '21-30' union all select 31, 40, '31-40' union all select 41, 50, '41-50' union all select 51, 2147483647, 'over 50' ) select Code, [0-10], [11-20], [21-30], [31-40], [41-50], [over 50] from ( select J.Code, J.RecordID, C.interval from tblJobs as J inner join C on datediff(day, J.JobStartDate, getdate()) between C.low and C.high ) as T pivot ( count(T.RecordID) for T.Interval in ([0-10], [11-20], [21-30], [31-40], [41-50], [over 50]) ) as P 

SQL Fiddle

  • Почему в SQL Server 2012 не работает xp_cmdshell?
  • Как сшить таблицы с помощью SQL?
  • SQL Server: большой запрос DB в кусках
  • Получить последний сгенерированный id asp.net
  • Как взять два SQL-запроса столбца подстрок для поиска в базе данных с помощью прилагаемого результата другого
  • Преобразование существующего столбца в идентификатор
  • получение верхнего ряда объединенной таблицы
  • Оптимизируйте самостоятельное присоединение к миллионам строк
  • Методы материализации T-SQL CTE, не работающие на SQL Server 2012
  • Как конвертировать yyyymm в Mon-yyyy?
  • Миграция с SQL Server 2005 по 2012 год
  • Interesting Posts

    Как настроить таблицы базы данных членства, созданные ASP.NET?

    Подключение к SQL Server из .NET с использованием учетной записи службы Active Directory

    Ошибка олицетворения для подключения к базе данных

    TSQL: создание представления, которое обращается к нескольким базам данных

    Рекурсивный результат CTE бесконечен

    Поделите автоматически увеличивающийся первичный ключ между двумя таблицами

    Вставка BULK SQL Server с нестандартным значением NULL

    Как «ВСТАВИТЬ ИЛИ ВЫБРАТЬ» в SQL Server 2012, используя меньшее количество операций?

    Заменить значения, разделенные запятыми

    Использование двойных кавычек для определения псевдонима поля является лучшим решением?

    Использует ли интегральный тип для первичного ключа более эффективное хранилище?

    Восстановление сопоставления пользователей при входе в систему после восстановления базы данных SQL Server 2008

    Недопустимое имя столбца для SQL Server в вложенных запросах

    Есть ли простой инструмент для добавления пользователей в базу данных SQL Server?

    Как получить последние записи на основе даты?

    Давайте будем гением компьютера.