2016-12-26 4 views
0

ここではID、名前、給与カラムからなるtblemployeeというテーブルがあります。名前と給与カラムは5行で構成され、名前列は3つの異なる名前から構成されています給与列は同じ整数値(つまり、給与列の各行に40,000)で構成されています。SQL Distinct関数は動作しません

表のtblemployee構造

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

は、今私が欲しいものを以下に示すように、私は名前欄が、給与の列から一つだけの給料値からすべての名前をしたい、ということである:

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

SQL Serverのクエリは私が期待した出力を与えていない試みました

select DISTINCT salary,name from tblabca 

答えて

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 

戻り

Name Salary 
jon  40000 
max 
rob 
joseph 25000 
mary  
+0

: 、働いた。 – CrossWords

+2

@sudipchandを助けてくれたことをうれしく思った。窓関数に慣れるのに時間がかかる。 –

0

"GROUP BY" aあなたのケースに合ったgroup_concatがあります。あなたが述べたようにあなたが結果を得ることはありませんGROUP BYGROUP_CONCAT

+0

給料でグループ化すると、すべての名前が取得されません。 – nicomp

+0

@rajasuba:助けてくれてありがとうございますが、集計関数またはGROUP BY句エラーに含まれていないので、選択リストに名前が無効です。 – CrossWords

+0

数分待ってください..私の答えを更新します.. – lsof

0

:リファレンス

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

このようにしてみてください。 DISTINCTオペレータはSETで動作するためです。個々の列ではありません。リレーショナルデータベースでは、セットだけを操作します。

したがって、SalaryとNameの組み合わせはDistinctとして扱われます。

しかし、あなたはあなたのようなすでに述べた他の人のよう

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

の下にコンマ連結されたリストに名前を取得することができますしたい場合、あなたは間違いなくDISTINCT演算子を探していません。

distinct演算子は結果セット全体を処理します。つまり、一意の結果行(列単位)が得られます。

あなたが望む結果に終わるかもしれませんが、本当にのような一様でない結果が欲しいですか?つまり、名前欄に名前のリストを表示し、給与欄に1つの給与しか表示されないような素晴らしい結果が表示されます。

あなたは、クエリで変更したいことを考慮に入れてコードを操作する必要があります。

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 
関連する問題