manufacturer_status
组织 | 年份 | 目标 |
---|---|---|
ABC | 2012 | 实现了 |
ABC | 2014 | 部分 |
ABC | 2015 | 失败 |
XYZ | 2014 | 部分 |
XYZ | 2015 | 失败 |
OPQ | 2012 | 失败 |
我想要每个组织实现的目标数据。如果它没有实现的目标数据,那么我需要部分目标数据。如果“已实现”和“部分”都不存在,则没有数据。
预期产出
组织 | 年份 | 目标 |
---|---|---|
ABC | 2012 | 实现了 |
XYZ | 2014 | 部分 |
我尝试过:
Select * from manufacturer_status where target='Achieved'
这只会给出组织 ABC。
Select * from manufacturer_status where target in ('Achieved', 'Partial')
这将为 ABC 提供两次,即“已实现”和“部分”。
看起来一些条件聚合可以解决问题
SELECT
ms.Organization,
ISNULL(
MIN(CASE WHEN ms.Target = 'Achieved' THEN ms.Year END),
MIN(CASE WHEN ms.Target = 'Partial' THEN ms.Year END)
) AS Year,
ISNULL(
MIN(CASE WHEN ms.Target = 'Achieved' THEN ms.Target END),
MIN(CASE WHEN ms.Target = 'Partial' THEN ms.Target END)
) AS Target
FROM manufacturer_status ms
WHERE ms.Target IN ('Achieved', 'Partial')
GROUP BY
ms.Organization;
您还可以使用窗口函数,因为在排序中
Achieved
位于 Partial
之前。
SELECT
ms.Organization,
ms.Year,
ms.Target
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY ms.Organization ORDER BY ms.Target, ms.Year) AS rn
FROM manufacturer_status ms
WHERE ms.Target IN ('Achieved', 'Partial')
) ms
WHERE ms.rn = 1;