我有fruits
表,参考国家/地区。我需要查询表并显示查询结果。
如果表中多次出现水果,即来自多个国家/地区,则只显示来自一个国家/地区的结果。此外,记录应根据国家的优先顺序选择,如下:新加坡(最优先),马来西亚,印度尼西亚。
我该如何查询?
结果应该是这样的:
答案 0 :(得分:4)
听起来你需要一个额外的表来保存国家的优先级值。 然后你可以按这个值排序。 将它与ROW_NUMBER语句和递归逻辑相结合,以获得所需的结果。
你最终会得到这样的东西:
--Sample data
DECLARE @fruit AS TABLE ([Type] VARCHAR(50), Country VARCHAR(50), Price DECIMAL(5,2))
DECLARE @country_priority AS TABLE (Country VARCHAR(50), [Priority] INT)
INSERT INTO @country_priority VALUES ('Singapore',3)
INSERT INTO @country_priority VALUES ('Malaysia',2)
INSERT INTO @country_priority VALUES ('Indonesia',1)
INSERT INTO @fruit VALUES ('Orange','Malaysia',25)
INSERT INTO @fruit VALUES ('Orange','Singapore',30)
INSERT INTO @fruit VALUES ('Orange','Indonesia',28)
INSERT INTO @fruit VALUES ('Apple','Malaysia',65)
INSERT INTO @fruit VALUES ('Apple','Singapore',55)
INSERT INTO @fruit VALUES ('Banana','Indonesia',88)
INSERT INTO @fruit VALUES ('Durian','Malaysia',77)
INSERT INTO @fruit VALUES ('Pineapple','Indonesia',15)
--query
;WITH summary AS (
SELECT f.[Type],
f.Country,
f.Price,
ROW_NUMBER() OVER(PARTITION BY f.[Type]
ORDER BY cp.[Priority] DESC) AS rank
FROM @fruit f
INNER JOIN @country_priority cp
ON f.Country = cp.Country)
SELECT s.*
FROM summary s
WHERE s.rank = 1
--results
Type Country Price rank
Apple Singapore 55.00 1
Banana Indonesia 88.00 1
Durian Malaysia 77.00 1
Orange Singapore 30.00 1
Pineapple Indonesia 15.00 1
注意:上面的连接基于varchar列,所以我可以快速举例说明。请根据您的需要选择合适的类型。这是一个很好的thread供您查看。