2015-11-19 17 views
0

我使用的是SQL Server 2012中,我有如下表:如何結合不同的標誌列插入單列

ID1 Team HasGender HasAge HasHeight 

1 Blue 1   (NULL) 1 
2 Blue 1   1 (NULL) 

...我想從放映創建一個單行:

ID1 Team HasGender HasAge HasHeight 
    1 Blue 1   1  1 

我不太在意哪一行帶來,我只需要把所有的標誌放在一行中。

我試過IsNULL,使用Group by Max(沒有工作,因爲標誌字段是位類型),然後我嘗試了以下使用COALESCE和自聯接,但它仍然不工作;它帶回行的倍數,以及標誌仍然沒有填寫,因爲我想他們:

SELECT t1.ID, t1.Team, 
      Gender=COALESCE(t1.HasGender, t2.HasGender), 
      Age=COALESCE(t1.HasAge, t2.HasAge), 
      Height=COALESCE(t1.HasHeight, t2.HasHeight) 
    FROM Table t1 INNER JOIN Table t2 
    ON t1.Team = t2.Team 

我應該注意到這個表有3個或4行這樣的標誌,所以當我加入我似乎得到倍數回來。

由於提前,

維羅尼卡

+0

只是爲了確保,你的標誌是可空位,這意味着你可以有0,1和* NULL *的價值?如果是這樣,當有3行的值爲'1','0'和'null'時會發生什麼? –

+0

它們確實是可空的位,但全是1或NULL,表中沒有0(幸好它不是一個很大的行,只有幾百行)。 – Veronica

+0

DIdi你找到任何有效的解決方案? – Simone

回答

0

你可以嘗試這樣的事:

SELECT MIN(ID1), Team, MAX(CONVERT(tinyint, HasGender)), MAX(CONVERT(tinyint, HasAge)), MAX(CONVERT(tinyint, HasHeight)) 
FROM Table 
GROUP BY Team 

編輯: 將數據轉換成TINYINT類型

+0

不幸的是,我收到以下消息:消息8117,級別16,狀態1,行1 操作數數據類型位對於最大操作員無效。因爲標誌字段是空字節 – Veronica

+0

這已經解決了我的問題,非常感謝。 – Veronica

+0

我很高興得到了一些幫助,請將其標爲有效答案:) – Simone

0

你可以投你的位的列一個tinyint,所以你可以在一個聚合中使用它們。像這樣的東西。

SELECT t1.ID 
    , t1.Team 
    , Gender = MAX(CAST(COALESCE(t1.HasGender, t2.HasGender) as tinyint)) 
    , Age = MAX(CAST(COALESCE(t1.HasAge, t2.HasAge) as tinyint)) 
    , Height = MAX(CAST(COALESCE(t1.HasHeight, t2.HasHeight) as tinyint)) 
    FROM Table t1 INNER JOIN Table t2 
    ON t1.Team = t2.Team 
2

對你不幸的是,沒有辦法做MAX(位)。這意味着你可以將其轉換爲另一種數據類型(即SMALLINT的青睞,因爲它是小的),或者你可以使用一個計數:如果你沒有0雖然

SELECT 
    Team, 
    CASE WHEN COUNT(HasGender)>0 THEN 1 ELSE 0 END AS HasGender 
    CASE WHEN COUNT(HasAge)>0 THEN 1 ELSE 0 END AS HasAge 
    CASE WHEN COUNT(HasHeight)>0 THEN 1 ELSE 0 END AS HasHeight 
FROM Table 
GROUP BY Team 

這隻作品。如果你有0,你將不得不作出有條件的計數(但在那一點上,我會去鑄造選項)。

要佔0,每行就需要像

CASE WHEN COUNT(CASE HasGender WHEN 1 THEN 1)>0 THEN 1 ELSE 0 END AS HasGender 
-1
select min(ID1) as ID1 , Team ,iif(sum(CAST(HasGender AS INT))>0,1,0) as HasGender , iif(sum(CAST(HasAge AS INT))>0,1,0) as HasAge ,iif(sum(CAST(HasHeight AS INT))>0,1,0) as HasHeight 
+1

請添加一些解釋。賦予基礎邏輯比賦予代碼更重要,因爲它可以幫助OP和其他讀者自己解決這個問題和類似的問題。 –