如果值为空,则合并行

Sta*_*vas 8 sql t-sql sql-server merge group-by

我正在使用SQL-Server 2008.我需要组合相同的行并在以下情况下Name增加计数器:

  1. Id's同样Name是1或更多blank
  2. 如果Id是,则不合并行NULL!
  3. 如果具有相同Name但不同的行,则不合并行Ids

目前输出:

Name    Id   Cnt
John    1     1
Peter   2     2 -- This Peter with the same Id have 2 entries so Cnt = 2
Peter   3     1 -- This is other Peter with 1 entry so Cnt = 1
Lisa    4     1
Lisa   NULL   1
David   5     1
David         1 -- here Id is blank ''
Ralph         2 -- Ralph have both rows with blank Id so Cnt = 2
Run Code Online (Sandbox Code Playgroud)

期望的输出:

Name    Id   Cnt
John    1     1
Peter   2     2
Peter   3     1
Lisa    4     1
Lisa   NULL   1 -- null still here
David   5     2 -- merged with blank '' so Cnt = 2
Ralph         2 -- merged both blanks '' so Cnt = 2
Run Code Online (Sandbox Code Playgroud)

SQL查询:

这是我现在使用的示例查询:

SELECT Name, 
       Id, 
       COUNT(Id) AS Cnt
FROM Employees                       
WHERE Condition = 1                 
GROUP BY Name, Id
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

将聚合添加MAXIdin SELECT子句中并Name仅按组分组,但在这种情况下,合并的行具有NULL值并且具有相同的名称,但Id's对我来说有什么不同之处.

SELECT Name, 
       MAX(Id), -- added aggregate
       COUNT(Id) AS Cnt
FROM Employees                       
WHERE Condition = 1                 
GROUP BY Name -- grouped by Name only
Run Code Online (Sandbox Code Playgroud)

你有什么想法吗?如果对问题一无所知 - 请问我,我会提供更多细节.

更新:

DDL

CREATE TABLE Employees
(
  Name NVARCHAR(40),
  Id NVARCHAR(40)
);
Run Code Online (Sandbox Code Playgroud)

DML

INSERT INTO Employees VALUES
 ('John' ,   '1')
,('Peter',   '2')
,('Peter',   '2')
,('Peter',   '3')
,('Lisa' ,   '4')
,('Lisa' ,  NULL)
,('David',   '5')
,('David',   '')
,('Ralph',   '')
,('Ralph',   '')
Run Code Online (Sandbox Code Playgroud)

DEMO: SQL FIDDLE

Eri*_*ric 1

编辑

DECLARE @Data table (Name varchar(10), Id varchar(10)) -- Id must be varchar for blank value
INSERT @Data VALUES
('John', '1'),
('Peter', '2'),('Peter', '2'), 
('Peter', '3'),--('Peter', ''), --For test
('Lisa', '4'),
('Lisa', NULL),
('David', '5'),
('David', ''),
('Ralph', ''), ('Ralph', '')
Run Code Online (Sandbox Code Playgroud)
SELECT 
    Name, 
    Id, 
    COUNT(*) + ISNULL(
        (SELECT COUNT(*) FROM @data WHERE Name = d.Name AND Id = '' AND d.Id <> '')
    , 0) AS Cnt 
FROM @data d 
WHERE 
    Id IS NULL 
    OR Id <> '' 
    OR NOT EXISTS(SELECT * FROM @data WHERE Name = d.Name AND Id <> '')
GROUP BY Name, Id
Run Code Online (Sandbox Code Playgroud)