2012-08-27 39 views
0

我有這樣獲取列值的組合,TSQL

rowid deltaValue Applicable 
1  r   n/d 
1  w   n/d 
1  m   n/d 
2  r   n/d 
2  w   n/d 
2  m   n/d 
3  r   n/d 
3  w   n/r 
3  m   n/d 

數據庫結構,所以基本上我只想選擇「ROWID」,即rowid=3的最後一組。這是因爲它是唯一一個具有n/d, n/r

的組合的組合,是否有一個tsql查詢將只查看組合並拉取組(即rowid)。 這是我到目前爲止有:

select * 
from table 
where 1=1 
and deltaValue in ('r','w','m') 
and (( 1=(case when [DeltaValue] = 'r' and [Applicable]='n/r' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/d' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/d' then 1 else 0 end) 
    ) OR 
    ( 1=(case when [DeltaValue] = 'r' and [Applicable]='n/d' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/r' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/d' then 1 else 0 end) 
    ) OR 
    ( 1=(case when [DeltaValue] = 'r' and [Applicable]='n/d' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/d' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/r' then 1 else 0 end) 
    ) 
    ) 

輸出:

3  r   n/d 
3  w   n/r 
3  m   n/d 
+0

你能告訴我們你想要的輸出嗎? –

+0

我已經添加了輸出 – masfenix

回答

1

試試這個:

with temp as 
(
    SELECT t.rowid 
    FROM myTable t 
    GROUP BY t.rowid 
    HAVING COUNT(CASE WHEN Applicable= 'n/d' THEN 1 END) > 0 
     AND COUNT(CASE WHEN Applicable= 'n/r' THEN 1 END) > 0; 
) 
select * from MyTable as mt 
INNER JOIN temp as t 
ON mt.RowId = t.RowId 
+0

rowid ='n/d'<---這沒有意義 – ClearLogic

+0

真棒謝謝,按預期工作。 – masfenix

0

請試試這個

SELECT  * 
FROM  Table1 
WHERE  rowid IN (SELECT rowid 
         FROM (SELECT * , DENSE_RANK() OVER (PARTITION BY rowid ORDER  BY Applicable) AS myRank FROM Table1 
          ) AS t 
         WHERE t.myRank > 1) 
0

下可能被認爲是一種發展NT上@Abe Miessler's建議:

WITH counted AS (
    SELECT 
    *, 
    [n/d count] = COUNT(CASE DeltaValue WHEN 'n/d' THEN 1 END) OVER (PARTITION BY rowid), 
    [n/r count] = COUNT(CASE DeltaValue WHEN 'n/r' THEN 1 END) OVER (PARTITION BY rowid) 
    FROM atable 
) 
SELECT 
    rowid, 
    DeltaValue, 
    Applicable 
FROM counted 
WHERE [n/d count] > 0 AND [n/r count] > 0 
; 

正如你所看到的,你可以通過避免使用windowing版本COUNT()聚集功能的加入。

順便說一句,如果你需要使查詢更加普遍,並且使得返回具有多個不同的DeltaValue,你可以使用一個稍微不同的方法的任何組:

WITH counted AS (
    SELECT 
    *, 
    MinDeltaValue = MIN(DeltaValue) OVER (PARTITION BY rowid), 
    MaxDeltaValue = MAX(DeltaValue) OVER (PARTITION BY rowid) 
    FROM atable 
) 
SELECT 
    rowid, 
    DeltaValue, 
    Applicable 
FROM counted 
WHERE MinDeltaValue <> MaxDeltaValue 
; 

上面的查詢使用窗口MAX()MIN()來查找每個組的最小值和最大值(rowid),並返回最小值不同於最大值的那些組。