2016-04-29 67 views
3

我想通過「ID」將兩列「Immo」+「Conso」組合起來,以創建一個新變量「Mixte」。我的新變量「MIXTE」是如下:SQL - 總計兩列組ID

  • 如果一個ID有(至少)1「IMMO」 AND 1「孔索」,然後「MIXTE」是肯定的,否則「MIXTE」是否定的。

對於爲例:

Ident | Immo | Conso | Mixte 
--------------------------------- 
1  | 0  | 1  | yes 
1  | 1  | 0  | yes 
2  | 1  | 0  | no 
3  | 0  | 1  | no 
3  | 0  | 1  | no 
3  | 0  | 1  | no 
4  | 0  | 1  | yes 
4  | 0  | 1  | yes 
4  | 1  | 0  | yes 

謝謝你對我的幫助。如果我不清楚,請毫不猶豫地問我問題。

+0

你的結果必須顯示所有記錄還是隻顯示每個Ident的一行(並且Immoand Conso沒有顯示在結果中,只有Ident和Mixte)? –

回答

1
select ident,result=(case when sum(Immo)>0 and sum(Conso)>0 then 'yes' 
       else 'no' end) 
from tabname (NOLOCK) 
group by id 
+0

這是完美的! – MVachelard

+0

謝謝,不客氣 –

4

使用相關子選擇:

select t1.Ident, t1.Immo, t1.Conso, 
     case when (select max(Immo) + max(Conso) from tablename t2 
        where t2.Ident = t1.Ident) = 2 then 'yes' 
      else 'no' 
     end as Mixte 
from tablename t1 

Ident是ANSI SQL的保留字,所以你可能需要界定它作爲"Ident"

+0

它在sas中工作嗎?當我正在執行我的proc sql時,它給了我一個錯誤...案例內容對於sas來說看起來不太合適。 – MVachelard

+0

它的工作原理。非常感謝。 – MVachelard

1

它可能不是smoothiest方式,但我會做到這一點是:

WITH X AS 
    (
    SELECT T.Ident, MAX(T.Immo) Immo, MAX(T.Conso) Conso FROM Table AS T 
    GROUP BY T.Ident 
    ) 

    SELECT X.* 
    ,CASE WHEN X.Immo > 0 AND X.Conso > 0 THEN 'YES' 
    ELSE 'NO' 
    END Mixte 
    FROM X 
+0

這看起來完全錯誤。首先,cte爲您提供了一個包含兩列的記錄,均等於1.並且cte中沒有Ident列。所以你不能從Ident讀取cte和group。並且顯示僅僅是yesses和nos列表的結果當然也不是期望的。 –

+0

你對第二部分是對的,但我不能同意第一部分。如果參數的值至少等於1,CTE應該給出兩列,兩者都至少等於1. – EpicKris

+0

我指的是包含immo = 1且conso = 1的記錄的樣本,因此查詢的結果本來是(1,1)。現在你已經改變了你的查詢並修復了這個問題該查詢看起來比需要更復雜一些,但工作正常 - 只要OP很好,每個Ident只有一個結果行。 (我的問題尚未得到OP的回覆)。 –

0

SQL-服務器你可以嘗試使用window functions,像:

select Ident, Immo, Conso, 
     case when rn1 > 0 and rn2 > 0 then 'Yes' else 'No' end as Mixte 
from (
    select 
      max(Immo) over (partition by Ident) rn1, 
      max(Conso) over (partition by Ident) rn2, 
      * 
    from table_name 
)x