从众多列中选择一个不同的列

时间:2016-05-03 16:19:33

标签: sql sql-server-2008

以下查询是一个简单的选择,但我需要选择国籍为不同,同时还要选择类型和类别(两者都不相同)。有没有办法呢?

SELECT NATIONALITY,TYPE,CATEGORIE FROM EMPLOYEE

2 个答案:

答案 0 :(得分:1)

尝试:

SELECT NATIONALITY,TYPE,CATEGORIE FROM EMPLOYEE 
Group by NATIONALITY,TYPE,CATEGORIE

我假设您拥有相同国籍的相同类型和类别。在另一种可能的情况下,您可以为同一国籍设置不同的类别和类型:

每个国籍都有不同的记录,你想为每个国家选择一个,但TYPE和CATEGORY的值应该是多少? 你需要使用聚合函数(Max,Min,Avg ......)选择一个

例如:

SELECT NATIONALITY,max(TYPE),max(CATEGORIE) FROM EMPLOYEE 
Group by NATIONALITY

答案 1 :(得分:0)

假设EMPLOYEE表的结构类似于以下 -

NATIONALITY  TYPE  CATEGORY
American     A     NR
American     C     SR
American     C     SR
American     B     GEN
Indian       A     SR
Indian       A     NR
Indian       B     NR
Indian       B     NR
Indian       B     GEN
Italian      C     GEN
Italian      A     SR
Italian      B     SR

并且要求是为每个NATIONALITY获取一条记录,并且可以为该NATIONALITY提供TYPE和CATEGORY的任意组合。

为此,您可以先在NATIONALITY上对表进行分区,然后添加row_number()。 Partition函数根据指定列的值将表的行映射到分区。在其上使用row_number(),将为每个NATIONALITY添加从1到N的行号。然后,这可以与row_number()= 1的where子句一起使用。

查询1

SELECT *, row_number() over(partition by NATIONALITY order by Nationality) 
as  RowNum from EMPLOYEE

结果如下:

NATIONALITY  TYPE  CATEGORY  RowNum
American     A     NR        1
American     C     SR        2
American     C     SR        3
American     B     GEN       4
Indian       A     SR        1
Indian       A     NR        2
Indian       B     NR        3
Indian       B     NR        4
Indian       B     GEN       5
Italian      C     GEN       1
Italian      A     SR        2
Italian      B     SR        3

现在上面的表可以在Common Table Expression(CTE)下使用,并且可以很容易地查询RowNum = 1。 可以将CTE视为在单个SELECT的执行范围内定义的临时结果集。它不作为对象存储,仅在查询期间持续。

查询2:

WITH MyCte AS
(
SELECT *,row_number() over(partition by NATIONALITY order by Nationality) 
as RowNum
from EMPLOYEE
)
SELECT  NATIONALITY, [TYPE], CATEGORY
FROM    MyCte
WHERE   RowNum =1

结果如下:

NATIONALITY  TYPE  CATEGORY
American     A     NR
Indian       A     SR
Italian      C     GEN