2016-01-27 42 views
-1

我想解決如何處理將一些數據聚合在一起的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

看着這個...一個case語句來定義狀態的順序,那麼你可以通過 – maSTAShuFu

+0

排序是這個mssql 2008r2或更高版本? – maSTAShuFu

+0

請在sqlfiddle http://sqlfiddle.com/#!6/9eecb7/5720找到解決方案 – maSTAShuFu

回答

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 
+0

沒有供應商拒絕是故意的。但是,我越看到我的原始問題,我可能會問一些問題。我將回到繪圖板並查看您提供的代碼。謝謝!我會盡力回覆 –

0

如果您提供您的狀態的層次,我可以嘗試編寫查詢。

這個想法是: 您可以按照您在新表格中的層次結構順序爲您的狀態提供一些編號(優先級排序),並且您可以加入此表並選擇最高/最低的網站(取決於您的編號)狀態號碼。

+0

以下是我要去的順序。完成-1正在處理 - 2已拒絕 - 3.以此類推,我可以修改一個模板。感謝您給我一個嘗試 –

+0

您是否嘗試了我的想法。? – Sahi