2012-05-29 12 views
30

मेरे पास शामिल तालिका में 'आंतरिक शामिल' के साथ एक SELECT अनुरोध है बिट प्रकार के साथ एक कॉलम है।बीआईटी कॉलम का MAX मान प्राप्त करें

मैं मूल्य 0.

हो जाएगा तो अगर मैं है 1 चयन करने के लिए करता है, तो शामिल हो गए तालिका में 1. के साथ सबसे अधिक एक मूल्य पर है चाहते हैं यह मामला नहीं है:

PERSID | NAME 
1  | Toto 
2  | Titi 
3  | Tata 

और दूसरा तालिका

PERSID | BOOL 
1  | 0 
1  | 0 
2  | 0 
2  | 1 

मैं चाहूँगा परिणाम

Toto -> 0 
Titi -> 1 
Tata -> 0 
के लिए है करने के लिए

मैं यह कोशिश:

SELECT 
    sur.* 
    ,MAX(bo.BOOL)  

    FROM SURNAME sur    
    INNER JOIN BOOL bo 
    ON bo.IDPERS = sur.IDPERS 

लेकिन मैक्स बीआईटी स्तंभ पर उपलब्ध नहीं है .. मुझे लगता है कि कैसे कर सकते हैं?

धन्यवाद,

+0

ऐसा लगता है कि 'उपयोग करने के लिए SUM' और' ग्रुप BY' अगर आपको लगता है कि _exactly_ एक मूल्य सुनिश्चित करना चाहते हैं की जरूरत है 1. – HABO

उत्तर

50

आप एक INT करने के लिए इसे डाल सकता है, और यहां तक ​​कि एक BIT करने के लिए इसे वापस डाली यदि आप के लिए

SELECT 
    sur.* 
    ,CAST(MAX(CAST(bo.BOOL as INT)) AS BIT) 
    FROM SURNAME sur    
    INNER JOIN BOOL bo 
    ON bo.IDPERS = sur.IDPERS 
8

प्रयास करें:

max(cast(bo.BOOL as int)) 
+3

है कृपया कोड की एक पंक्ति पोस्ट न करें। इसे समझाओ। -1 – Manishearth

+0

वह इसे एक पूर्णांक के रूप में कास्टिंग कर रहा है ताकि वह अधिकतम समग्र फ़ंक्शन का उपयोग कर सके। – Jackson

5

एक तरह से की जरूरत है

SELECT 
    sur.* 
    ,MAX(convert(tinyint,bo.BOOL))  

    FROM SURNAME sur    
    INNER JOIN BOOL bo 
    ON bo.IDPERS = sur.IDPERS 
+1

धन्यवाद! क्या CAST() और CONVERT() के बीच कोई अंतर है? – bAN

+1

नहीं वे वही हैं, मैं बस बेहतर रूपांतरित करना पसंद करता हूं – SQLMenace

0

आप के साथ ही उन लोगों को चाहते हैं वास्तव में एक सेट बिट:

declare @Surname as Table (PersId Int, Name VarChar(10)) 
insert into @Surname (PersId, Name) values 
    (1, 'Toto'), (2, 'Titi'), (3, 'Tata'), (4, 'Tutu') 

declare @Bool as Table (PersId Int, Bool Bit) 
insert into @Bool (PersId, Bool) values 
    (1, 0), (1, 0), 
    (2, 0), (2, 1), 
    (4, 1), (4, 0), (4, 1) 

select Sur.PersId, Sur.Name, Sum(Cast(Bo.Bool as Int)) as [Sum], 
    case Sum(Cast(Bo.Bool as Int)) 
    when 1 then 1 
    else 0 
    end as [Only One] 
    from @Surname as Sur left outer join 
    @Bool as Bo on Bo.PersId = Sur.PersId 
    group by Sur.PersId, Sur.Name 
    order by Sur.Name 
संबंधित मुद्दे