Запретить группирование строк по значению NULL - PullRequest
0 голосов
/ 27 апреля 2020

Согласно этой статье:

При группировании со столбцом в операторе GROUP BY, содержащем NULL, они будут помещены в одну группу в вашем наборе результатов:

Однако я хочу предотвратить группирование строк по значению NULL.

Следующий код дает мне одну строку:

IF(OBJECT_ID('tempdb..#TestTable') IS NOT NULL)
    DROP TABLE #TestTable
GO 

CREATE TABLE #TestTable ( ID INT, Value INT )

INSERT INTO #TestTable(ID, Value) VALUES 
(NULL, 70),
(NULL, 70)


SELECT 
  ID
, Value
FROM #TestTable 
GROUP BY ID, Value

Вывод:

ID     Value
NULL    70

Однако я хотел бы иметь две строки. Мой желаемый результат выглядит так:

NULL    70
NULL    70

Можно ли иметь две строки с GROUP BY?

ОБНОВЛЕНИЕ:

Что я нужно посчитать эти строки:

SELECT 
COUNT(1) AS rows
FROM (SELECT 1 AS foo
    FROM #TestTable 
    GROUP BY ID, Value
)q

OUTPUT: 1

Но, на самом деле, есть две строки. Мне нужен вывод, чтобы иметь 2.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Вам нужен способ сделать NULL значения в Id уникальными. Использование следующего кода сделает значения уникальными, но продолжит группировать ненулевое значение в силу значения по умолчанию для выражения case, равного NULL:

group by Id, case when Id is NULL then NewId() end, Value
2 голосов
/ 27 апреля 2020

Предполагая, что вам нужно такое поведение, потому что вы хотите сгруппировать по значениям столбца, который может иметь значение NULL (Id в вашем примере), вы можете добавить row_number, когда столбец id равен NULL, используя общее табличное выражение для создания искусственное различие между дублирующимися группами - вот так:

-- Adding some more rows to the table
INSERT INTO #TestTable(ID, Value) VALUES 
(NULL, 70),
(NULL, 70),
(1, 70),
(1, 70),
(2, 70);

Запрос с cte:

WITH CTE AS
(
    SELECT Id, Value, IIF(Id IS NULL, ROW_NUMBER() OVER(ORDER BY Id), NULL) As Surrogate
    FROM #TestTable 
)
SELECT 
  ID
, Value
FROM CTE
GROUP BY ID, Surrogate, Value

Результаты:

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