Sta*_*vas 8 sql t-sql sql-server merge group-by
我正在使用SQL-Server 2008.我需要组合相同的行并在以下情况下Name增加计数器:
Id's同样Name是1或更多blankId是,则不合并行NULL!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)
我尝试过的:
将聚合添加MAX到Idin 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
编辑
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)