Używam SQL-Server 2008. Muszę połączyć wiersze z tego samego licznika Name
i zwiększ gdy:Połączyć wiersze, jeśli wartość jest pusta
- 1 lub więcej
Id's
dla tego samegoName
jestblank
- NIE łączyć wiersze jeśli
Id
jestNULL
! - NIE scalanie wierszy, jeśli mają taką samą
Name
, ale różniIds
Wyjście teraz:
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
pożądany wynik:
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
zapytania SQL :
To przykładowe zapytanie co używam teraz:
SELECT Name,
Id,
COUNT(Id) AS Cnt
FROM Employees
WHERE Condition = 1
GROUP BY Name, Id
Co próbowałem:
Dodano kruszywo MAX
do Id
w SELECT
klauzuli i pogrupowane według jedynego Name
, ale w tym przypadku scalono wiersze o wartościach NULL
i o tych samych nazwach z różnymi Id's
, co jest dla mnie złe.
SELECT Name,
MAX(Id), -- added aggregate
COUNT(Id) AS Cnt
FROM Employees
WHERE Condition = 1
GROUP BY Name -- grouped by Name only
Masz jakieś pomysły? Jeśli coś nie jest jasne na temat problemu - zapytaj mnie, podam więcej szczegółów.
UPDATE:
DLL
CREATE TABLE Employees
(
Name NVARCHAR(40),
Id NVARCHAR(40)
);
DML
INSERT INTO Employees VALUES
('John' , '1')
,('Peter', '2')
,('Peter', '2')
,('Peter', '3')
,('Lisa' , '4')
,('Lisa' , NULL)
,('David', '5')
,('David', '')
,('Ralph', '')
,('Ralph', '')
DEMO:SQL FIDDLE
+1 za dobrze sformułowane pytanie. jednak lepiej jest uwzględnić odpowiednie tabele ddl + dml dla przykładowych danych, aby każdy, kto chce odpowiedzieć, mógł je łatwo odtworzyć. –
Dziwny projekt danych w tabeli ... Czy rozważasz zmianę danych? – Anton
@ZoharOferowany drugi, dostarczę DDL + DML –