基于两个条件返回1行

问题描述 投票:0回答:2

假设我有一个价格表,如下表所示。我想返回一个基于以下条件的,由不同ItemCode值组成的表,彼此相关...

  • 如果USD = true,则返回美元价格行,否则返回欧元价格行
  • 如果EndDate为NULL,则返回带有NULL EndDate的行,否则返回带有NOT NULL EndDate的行
+----------+-------+----------+------------+------------+
| ItemCode | Price | Currency | StartDate  | EndDate    |
+----------+-------+----------+------------+------------+
| A02143803 | 18    | USD      | 01/09/2019 | NULL       |
+----------+-------+----------+------------+------------+
| A02143803 | 17    | EUR      | 01/09/2019 | NULL       |
+----------+-------+----------+------------+------------+
| A02143805 | 18    | USD      | 01/09/2019 | 31/12/2019 |
+----------+-------+----------+------------+------------+
| A02143805 | 17,7  | USD      | 01/01/2020 | NULL       |
+----------+-------+----------+------------+------------+
| A02143805 | 16    | EUR      | 01/09/2019 | NULL       |
+----------+-------+----------+------------+------------+

最终结果应类似于:

+----------+-------+----------+------------+---------+
| ItemCode | Price | Currency | StartDate  | EndDate |
+----------+-------+----------+------------+---------+
| A02143803 | 18    | USD      | 01/09/2019 | NULL    |
+----------+-------+----------+------------+---------+
| A02143805 | 17,7  | USD      | 01/01/2020 | NULL    |
+----------+-------+----------+------------+---------+

[请您提出获得此结果的最佳方法是什么?SQL COALESCE是否可以解决我的问题?

sql-server
2个回答
0
投票

您可以使用row_number()

select t.*
from (select t.*, 
             row_number() over (partition by itemcode 
                                order by (case when Currency = 'USD' then 0 else 1 end)
                                         (case when enddate is null then 1 else 0 end), enddate desc
                               ) as seq
      from table t
     ) t
where seq = 1;

0
投票

尝试一下:

SELECT *,
       ROW_NUMBER() OVER (PARTITION BY ItemCode 
                          ORDER BY 
                             CASE 
                                WHEN Currency = 'USD' THEN 1 
                                ELSE 2
                             END,
                             CASE 
                                WHEN EndDate IS NULL THEN 1
                                ELSE 2 
                             END)
FROM Table1 

Demo here

© www.soinside.com 2019 - 2024. All rights reserved.