我有一个包含如下数据的表格:
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。
答案 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个查询就变成了一个。