我正在尝试解决如何处理将一些数据聚合在一起的SQL查询。这是我的样本数据集。
SITE STATUS VENDOR
1234 Rejected Joe
1234 Rejected John
1234 Approved Jane
1234 Rejected Jeb
5644 Rejected Joe
5644 Rejected John
5644 In Process Jane
8877 Rejected Joe
8877 Rejected John
我希望结果数据集看起来像下面的
1234 Approved Jane
5644 In Process Jane
8877 Rejected
同一网站可以有1到10条记录。状态有一个层次结构。例如,如果站点上的任何状态为“已批准”,则所有其他状态均无关紧要。
我确实意识到这与之前提出的其他一些问题类似。这是我的第一篇文章。如果您发现其他与我正在寻找的内容相符的帖子,请随时分享。
以下是我编写的查询示例:
SELECT DISTINCT [SITE]
,(SELECT
CASE
WHEN MIN(Status) = 'Completed' THEN 'Completed'
WHEN MIN(Status) = 'In Process' THEN 'Shopping'
WHEN MIN(Status) = 'Rejected' THEN 'Rejected'
WHEN MIN(Status) = 'Withdrawn' THEN 'Withdrawn'
WHEN MIN(Status) = 'Hold' THEN 'Hold'
ELSE 'No Status'
END AS status
FROM [dbo].[test] subtest
WHERE test.SITE = subtest.SITE AND subtest.OverallStatus = 'A' GROUP BY site) AS test_status
,Vendor
FROM [dbo].[test] test
WHERE OverallStatus = 'A'
ORDER BY SITE
很抱歉从我的环境编辑我的代码,可能错过了一些更改。 OverallStatus是表中未显示的值。
答案 0 :(得分:2)
rejected
上没有供应商,这有点奇怪。但是,确定优先级的一种方法是使用row_number()
并使用花式order by
:
select site, status,
(case when status <> 'Rejected' then vendor end) as vendor
from (select t.*,
row_number() over (partition by site
order by (case when status = 'Approved' then 1
when status = 'In Process then 2
else 3
end)
) as seqnum
from t
) t
where seqnum = 1
答案 1 :(得分:0)
如果您提供状态层次结构,我可以尝试编写查询。
这个想法是: 您可以按照新表中层次结构的顺序为您的状态(优先级排序)提供一些编号,然后您可以加入此表并选择具有最高/最低(取决于您的编号)状态编号的站点。