选择基于列的行

时间:2011-07-11 20:02:08

标签: sql sql-server tsql sql-server-2008-r2

我有一个包含如下数据的表格:

ID    Mfgr    Primary_Mfgr
a1    Acme    P
a1    Bcme    S
a1    Ccme    S
b1    Acme
b1    Bcme
c1    Acme    S
c1    Bcme
d1    Acme
d1    Bcme

我需要创建一个select语句,根据ID返回记录,用P作为Primary_Mfgr,如果没有P记录,则返回空白记录,如果那些不存在则返回第一个S记录。在所有情况下,如果有重复项,则返回第一个结果。

因此,使用上述数据我希望从四个不同的查询中返回以下内容:

查询a1:

a1    Acme    P

查询b1:

b1    Acme

查询c1:

c1    Bcme

查询d1:

d1    Acme

在每种情况下,我只需要返回一条记录。我不确定如何构建这样做。例如,我可以很容易地找回所有'a1'记录,但我不确定如何编写一个可以获取ID参数的查询,并且在所有情况下仍然返回正确的单个记录。我正在使用SQL Server 2008 R2。

2 个答案:

答案 0 :(得分:3)

您可以通过带有case语句的Primary_Mfgr列进行排序,然后选择top 1

SELECT TOP 1 *
FROM Table1
WHERE ID = @ID
ORDER BY 
    CASE Primary_Mfgr 
        WHEN 'P' THEN 1
        WHEN ''  THEN 2
        ELSE 3
    END

答案 1 :(得分:3)

这将按字母顺序排列“第一个”Mfgr(取决于整理等),其中给定ID / Primary_Mfgr对有多个。否则,您可以将辅助排序更改为另一列(您有一个)或将其保留以获取随机记录。

;WITH myCTE AS
(
    SELECT
       *,
       ROW_NUMBER() OVER (
               PARTITION BY ID
               ORDER BY
                  CASE Primary_Mfgr 
                     WHEN 'P' THEN 1 WHEN 'S' THEN 3 ELSE 2
                  END, Mfgr) AS rn
    FROM
       MyTable
)
SELECT *
FROM myCTE
WHERE rn = 1

编辑:您不必每个ID查询一次这是愚蠢的:这个答案一次性对所有ID进行查询。所以你上面的4个查询就变成了一个。