Sql 根据某些规则从行中获取值

Sql 根据某些规则从行中获取值,sql,sql-server,Sql,Sql Server,我试图解决如何处理将一些数据聚合在一起的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

我试图解决如何处理将一些数据聚合在一起的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是表中未显示的一个值。

有点奇怪,表中没有供应商。但是,进行优先级排序的一种方法是通过以下方式使用具有奇特顺序的行数:


如果您提供状态的层次结构,我可以尝试编写查询

这个想法是:
您可以为您的状态提供一些编号,在新表中按照层次结构的顺序排列优先级,您可以加入此表,并根据您的编号状态编号选择最高/最低的站点。

查看此。。。用于定义状态顺序的case语句,然后您可以按此进行排序。这是mssql 2008r2还是更高版本?请在SQLFIDLE中找到解决方案您的示例代码不适用于您提供的表。什么是整体状态和戒指?嘿@KirkBroadhurst,我在更新之前就制定了解决方案。。。谁知道呢!没有被拒绝的供应商是故意的。但是,我越是看我最初的提问,我可能就有点过火了。我将回到绘图板,看看您提供的代码。谢谢我会尝试和后将以下将是我会去的顺序。已完成-1正在处理中-2已拒绝-3。等等,用一个模板我可以修改。谢谢你试一试
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