ВЫБЕРИТЕ количество на основе значения столбцов - PullRequest
0 голосов
/ 23 октября 2019

У меня есть такая таблица

Date  | Name  | StateData |
------+-------+-----------+    
xxxxx | Tom   | OPENED    |
xxxxx | David | NULL      |
xxxxx | Tom   | NULL      |
xxxxx | Brand | CLOSED    |
xxxxx | Brand | NULL      |
xxxxx | Brand | OPENED    |

Какой результат я хочу достичь, это что-то вроде этого

Date | Name | OPENED | CLOSED | UNUSED |
-----+------+--------+--------+--------+
xxxxx| Tom  |   1    |    0   |    1   |
xxxxx| David|   0    |    0   |    1   |
xxxxx| Brand|   1    |    1   |    1   |

Я пробовал что-то подобное

SELECT 
    Name,
    [OPENED] = COUNT(CASE WHEN StateData ='OPENED' THEN StateData END),
    [CLOSED] = COUNT(CASE WHEN StateData ='CLOSED' THEN StateData END),
    [UNUSED] = COUNT(CASE WHEN StateData IS NULL THEN StateData END)
FROM 
    [dbo].[StateData]
GROUP BY
    Name

В результате у меня нет по крайней мере повторяющихся записей в столбце Имя, но с помощью простого выбора счетчика (*) я ясно вижу, что значения в столбцах неверны.

Первый изВсе, что я сделал Google некоторые образцы, и сделал SELECT выше.

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

Я бы использовал SUM() вместо этого. У вас проблема с NULL:

SELECT Name,
       SUM(CASE WHEN StateData = 'OPENED' THEN 1 ELSE 0 END) as opened
       SUM(CASE WHEN StateData = 'CLOSED' THEN 1 ELSE 0 END) as closed
       SUM(CASE WHEN StateData IS NULL THEN 1 ELSE 0 END) as unused
FROM [dbo].[StateData]
GROUP BY Name;

Ваш unused всегда будет равен нулю, потому что COUNT(NULL) всегда равен нулю.

2 голосов
/ 23 октября 2019

Это «простой» стержень. Лично я предпочитаю использовать кросс-таблицу вместо ограничительного оператора PIVOT:

SELECT [Date],
       [Name],
       COUNT(CASE StateData WHEN 'OPENED' THEN 1 END) AS OPENED,
       COUNT(CASE StateData WHEN 'CLOSED' THEN 1 END) AS CLOSED,
       COUNT(CASE WHEN StateData IS NULL THEN 1 END) AS UNUSED
FROM YourTable
GROUP BY [Date],
         [Name];

Обратите внимание, что помеченная вами версия SQL Server (2008) теперь полностью не поддерживается. Поэтому настоятельно рекомендуется как можно скорее взглянуть на пути обновления.

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