2016-12-26 1 views
0

Hier habe ich eine Tabelle namens tblemployee, die ID, Name und Gehaltsspalte besteht.Die Name und Gehaltsspalte besteht aus fünf Zeilen, Name Spalte besteht aus 3 verschiedenen Namen (dh jeder Name in der Spalte Name nicht mit einem anderen Namen übereinstimmen), während die Gehaltsspalte den gleichen ganzzahligen Wert enthält (dh 40.000 in jeder Zeile der Gehaltsspalte).SQL Distinct Funktion funktioniert nicht

Tabelle tblemployee Struktur

name|salary 
----------- 
max |40000 
rob |40000 
jon |40000 

Nun, was ich will, ist, dass ich die Namen aller von Namensspalte wollen aber nur einen Gehalt Wert aus Spalte Gehalt wie unten dargestellt:

name|salary 
----------- 
max |40000 
rob | 
jon | 

SQL Server Abfrage ich habe versucht, die nicht die erwartete Ausgabe

select DISTINCT salary,name from tblabca 

Antwort

3
Declare @tblemployee table (name varchar(25),salary int) 
Insert Into @tblemployee values 
('max',40000), 
('rob',40000), 
('jon',40000), 
('joseph',25000), 
('mary',25000) 

Select Name 
     ,Salary = case when RN=1 then cast(Salary as varchar(25)) else '' end 
From (
Select * 
     ,RN = Row_Number() over (Partition By Salary Order By Name) 
     ,DR = Dense_Rank() over (Order By Salary) 
From @tblemployee 
) A 
Order by DR Desc,RN 

Returns Namen in Komma verketteten Liste erhalten

Name Salary 
jon  40000 
max 
rob 
joseph 25000 
mary  
+0

: Danke, Sir, habe es , arbeitete.Würdige – CrossWords

+2

@sudipchand Glücklich es geholfen.Es lohnt sich Ihre Zeit, um sich mit den Fensterfunktionen.Sie können INVALUABLE –

0

"GROUP BY" a gegeben nd group_concat würde zu Ihrem Fall passen. Bitte versuchen Sie es wie diese

select salary, group_concat(name) from tblabca group by salary; 

Referenz: GROUP BY, GROUP_CONCAT

+0

Wenn Sie nach Gehalt gruppieren, erhalten Sie nicht alle Namen. – nicomp

+0

@rajasuba: Danke für Hilfe, aber es wird Name ist ungültig in der Auswahlliste, weil es weder in einer Aggregatfunktion oder der GROUP BY-Klausel Fehler – CrossWords

+0

enthalten ist Bitte warten Sie ein paar Minuten .. Ich werde meine Antwort aktualisieren .. – lsof

0

Sie werden nie das Ergebnis erhalten, wie Sie angegeben. Weil DISTINCT Operator auf einem SET arbeitet. nicht auf einzelne Spalte. In einer relationalen Datenbank arbeiten Sie nur mit Sets.

So wird die Kombination aus Gehalt und Name als Distinct behandelt.

Aber wenn Sie möchten, können wie unten

SELECT SALARY 
, STUFF ((SELECT ','+NAME From TableA T2 
WHERE T1.SALARY = T2.SALARY FOR XML PATH('') 
),1,1,'') FROM TABLEA T1 
0

Wie andere bereits gesagt, Sie suchen auf jeden Fall nicht für DISTINCT-Operator.

Der distinkte Operator arbeitet mit der gesamten Ergebnismenge, das heißt, Sie erhalten Ergebniszeilen, die eindeutig sind (Spalte für Spalte).

Obwohl mit etwas Nacharbeit Sie am Ende mit dem gewünschten Ergebnis enden können, wollen Sie wirklich wollen das Ergebnis in einer solchen nicht einheitlichen Art und Weise? Ich meine, eine Liste von Namen in der Namensspalte zu bekommen und nur ein Gehalt in der Gehaltsspalte sieht nicht nach einem netten Ergebnis aus, mit dem ich arbeiten kann.

Maby Sie sollten an Ihrem Code arbeiten, um die Änderung zu berücksichtigen, die Sie in der Abfrage vornehmen möchten.

0
declare @tblemployee Table(
    id int identity(1,1) primary key not null, 
    name nvarchar(MAX) not null, 
    salary int not null 
); 

declare @Result Table(
    name nvarchar(MAX) not null, 
    salaryString nvarchar(MAX) 
); 

insert into @tblemployee(name,salary) values ('joseph' ,25000); 
insert into @tblemployee(name,salary) values ('mary' ,25000); 
insert into @tblemployee(name,salary) values ('Max' ,40000); 
insert into @tblemployee(name,salary) values ('rob' ,40000); 
insert into @tblemployee(name,salary) values ('jon' ,40000); 

declare @LastSalary int = 0; 
declare @name nvarchar(MAX); 
declare @salary int; 



DECLARE iterator CURSOR LOCAL FAST_FORWARD FOR 
    SELECT name, 
      salary 
    FROM @tblemployee 
    Order by salary desc 
OPEN iterator 
FETCH NEXT FROM iterator INTO @name,@salary 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF (@[email protected]) 
     BEGIN 
      SET @LastSalary = @salary 
      insert into @Result(name,salaryString) 
      values(@name,@salary+''); 
     END 
     ELSE 
     BEGIN 
      insert into @Result(name,salaryString) 
      values(@name,''); 
     END 
     FETCH NEXT FROM iterator INTO @name,@salary 
    END 

Select * from @Result