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

时间:2016-01-27 22:43:57

标签: 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     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是表中未显示的值。

2 个答案:

答案 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)

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

这个想法是: 您可以按照新表中层次结构的顺序为您的状态(优先级排序)提供一些编号,然后您可以加入此表并选择具有最高/最低(取决于您的编号)状态编号的站点。