Sql server SQL独特函数din';行不通

Sql server SQL独特函数din';行不通,sql-server,Sql Server,这里有一个名为tblemployee的表,它由id、name和salary列组成。name和salary列由五行组成,name列由三个不同的名称组成(即name列中的每个名称与另一个名称不匹配),而salary列由相同的整数值组成(即salary列中的每行40000) 表tblemployee结构 name|salary ----------- max |40000 rob |40000 jon |40000 现在我想要的是,我想要的是name列中的所有名称,但salary列中只有一个sala

这里有一个名为tblemployee的表,它由id、name和salary列组成。name和salary列由五行组成,name列由三个不同的名称组成(即name列中的每个名称与另一个名称不匹配),而salary列由相同的整数值组成(即salary列中的每行40000)

表tblemployee结构

name|salary
-----------
max |40000
rob |40000
jon |40000
现在我想要的是,我想要的是name列中的所有名称,但salary列中只有一个salary值,如下所示:

name|salary
-----------
max |40000
rob |
jon |
我尝试过的Sql Server查询没有给出预期的输出

select DISTINCT salary,name from tblabca
“分组方式”和“分组方式”适合您的情况。请像这样试试

select salary, group_concat(name) from tblabca group by salary;
参考资料:,

“分组方式”和“分组方式”适合您的情况。请像这样试试

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

参考资料:,

你永远不会得到你所说的结果。因为
DISTINCT
运算符在集合上工作。不在单个列上。在关系数据库中,只能使用集合

因此,工资和姓名的组合将被视为不同的

但若你们愿意,你们可以在下面的逗号连接列表中找到名字

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

你永远不会得到你所说的结果。因为
DISTINCT
运算符在集合上工作。不在单个列上。在关系数据库中,只能使用集合

因此,工资和姓名的组合将被视为不同的

但若你们愿意,你们可以在下面的逗号连接列表中找到名字

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

Name    Salary
jon     40000
max 
rob 
joseph  25000
mary    
返回

Name    Salary
jon     40000
max 
rob 
joseph  25000
mary    

正如其他人已经指出的,您肯定不是在寻找不同的运算符

distinct运算符将处理整个结果集,这意味着您将获得唯一的结果行(逐列)

虽然通过一些返工,您可能最终得到您想要的结果,但您是否真的希望以这样一种不统一的方式得到结果?我的意思是,在“姓名”列中列出姓名,而在“薪资”列中只列出一份薪资,这看起来并不是一个很好的结果集


也许你应该用你的代码来解释你想在查询中做的更改。

正如其他人已经说过的,你肯定不是在寻找不同的操作符

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 (@salary!=@LastSalary)
        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
distinct运算符将处理整个结果集,这意味着您将获得唯一的结果行(逐列)

虽然通过一些返工,您可能最终得到您想要的结果,但您是否真的希望以这样一种不统一的方式得到结果?我的意思是,在“姓名”列中列出姓名,而在“薪资”列中只列出一份薪资,这看起来并不是一个很好的结果集


也许你应该编写代码来解释你想在查询中所做的更改。

如果你按薪资分组,你将无法得到所有的姓名。@rajasuba:谢谢你的帮助,但它将给出的姓名在选择列表中无效,因为它既不包含在聚合函数中,也不包含在group by子句errorNo@nicomp中,它将只给出表中的第一个名称(即与您的条件匹配的第一行)。Group by concats“将所选行的列表连接成一行”并给出结果。是的,它将..@Shakeermirzan如果您按薪资分组,您将无法获得所有名称。@rajasuba:谢谢帮助,但它将给出的名称在选择列表中无效,因为它不包含在聚合函数或group by子句errorNo@nicomp中,它将只给出第一个名称(即,与您的条件匹配的第一行)。Group by concats“将所选行的列表连接为一行”然后给我们结果。是的,会的@ShakeerMirza@sudipchand很高兴它起到了作用。花时间熟悉窗口功能是值得的。它们可以INVALUABLE@sudipchand很高兴它起到了作用。花时间熟悉窗口功能是值得的。它们是无价的
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 (@salary!=@LastSalary)
        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