У меня есть таблица SQL со структурой, подобной следующей:

  Name     Value
(varchar)  (bit)
__________________
 Val1       1
 Val2       1
 Val3       0
 Val4       0
 Val1       0
 Val2       0
 Val3       0
 Val4       1

Итак, у меня есть два экземпляра одной и той же строки, но с другим битовым значением. Я хочу получить отдельные строки из этой таблицы с оператором ИЛИ. Итак, для данного примера результат будет выглядеть так:

Name    Value

Val1      1    (1 | 0)
Val2      1    (1 | 0)
Val3      0    (0 | 0)
Val4      1    (0 | 1)

Можно ли этого добиться? Я работаю в Microsoft SQL Server 2012. Любая помощь приветствуется. Пожалуйста, дайте мне знать, если требуются какие-либо дополнительные разъяснения.

3
Prashant Tiwari 6 Янв 2016 в 13:53

3 ответа

Лучший ответ

Заметим, что «поразрядное ИЛИ» имеет ту же функцию, что и агрегатная функция MAX (при условии, что все входные данные равны 0 или 1, если любой вход равен 1, результат равен 1, в противном случае 0), и учитывая тот факт, что мы не может напрямую агрегировать bit, похоже, это работает:

declare @t table (Name varchar(17) not null,Value bit not null)
insert into @t(Name,Value) values
('Val1',1),
('Val2',1),
('Val3',0),
('Val4',0),
('Val1',0),
('Val2',0),
('Val3',0),
('Val4',1)

select Name,CONVERT(bit,MAX(CONVERT(int,Value))) as Value
from @t group by Name
9
Damien_The_Unbeliever 6 Янв 2016 в 10:59

Вы можете попробовать это, надеясь, что значение будет числовым полем со значениями 0 и 1.

SELECT Name, MAX(Value)
FROM [table]
GROUP BY Name
2
Kiran Hegde 6 Янв 2016 в 11:00
DECLARE @t TABLE (Name VARCHAR(10) NOT NULL, Value BIT NOT NULL)

INSERT INTO @t (Name, Value)
VALUES
    ('Val1', 1), ('Val2', 1), ('Val3', 0), ('Val4', 0),
    ('Val1', 0), ('Val2', 0), ('Val3', 0), ('Val4', 1)

SELECT Name, MAX(Value % 2)
FROM @t
GROUP BY Name

Выход -

---------- -----------
Val1       1
Val2       1
Val3       0
Val4       1
1
Devart 6 Янв 2016 в 11:09