Как использовать СВОДНОЕ предложение над пустыми значениями

#sql #sql-server #tsql #pivot

#sql #sql-сервер #tsql #сводная

Вопрос:

Пример данных:

 Data table1:
prodid  type location(there are more columns, just ignoring them for this example)
p001        t1      l1
p002        t1      l2
p003        t3      l1
p004        t2      
p005        t1      l1

Need a summary like
type    Blank [l1]  [l2]
t1      0           2           1
t2      1           0           0
t3      0           1           0
  

Проблема, с которой я сталкиваюсь, связана с пустыми значениями в поле location . Я не знаю, как представить пустые значения местоположения в сводном запросе.

 Pivot query:
1: select type, [] as Blank, [l1], [l2], Blank   [l1]   [l2] as Total from
2: (select type, location from table1)
3: pivot 
4: (count(location) for location in ([],[l1],[l2]) t2

Error on line 1 amp; 4
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Add a name or single space as the alias name. 
  

Ответ №1:

Как насчет того, чтобы просто поменять местами пустые / пустые места для фиктивного значения. Так что измените

 select type, location from table1
  

Для

 select type, CASE WHEN location is null THEN 'ZZ' ELSE location END as location from table1
  

Тогда столбцом будет zz или любое другое фиктивное значение, которое вы выберете

Комментарии:

1. Я поставил РЕГИСТР, потому что не был уверен, были ли ваши местоположения пустыми строками или действительно нулевыми. Если они равны нулю, вы можете использовать isnull(location, ‘zz’), что, я думаю, должно быть немного более эффективным. Хотя, если у вас нет большого количества данных, вы этого не заметите.

Ответ №2:

Вы могли бы просто отказаться PIVOT и использовать

 SELECT type,
       COUNT(CASE
               WHEN location = '' THEN 1
             END) AS Blank,
       COUNT(CASE
               WHEN location = 'l1' THEN 1
             END) AS l1,
       COUNT(CASE
               WHEN location = 'l2' THEN 1
             END) AS l2,
       COUNT(*)   AS Total
FROM   table1
WHERE location in ('','l1','l2')
GROUP  BY type
  

Комментарии:

1. Спасибо за быстрый ответ, Мартин. В таблице Acutal больше значений местоположения, и они могут меняться. когда я буду знать, как обрабатывать пустые значения, я планировал создать некоторую структуру программы, чтобы получить уникальный список и подготовить сводный sql и запустить, чтобы сделать его динамичным. Я могу сделать то же самое для предлагаемого запроса, но он может затянуться. Есть мысли?