Вы можете использовать логику Not Exists
с помощью multiplication
двух слагаемых:
decode(Category,'Veggie',1,'Fruits',1,0)
- это Zero
, т. Е. Not Veggie/Fruits
или
nvl2(Date_Distributed,1,0)
является Zero
( ноль ), то есть Not Distributed
with T2( T2_ID, Category, Date_Distributed, T1_ID ) as
(
select '01','Veggie', date'2018-01-01', 1 from dual union all
select '02','Fruits', date'2018-01-03', 1 from dual union all
select '03','Veggie', null , 2 from dual union all
select '04','Nuts' , date'2018-01-05', 2 from dual union all
select '05','Fruits', null , 3 from dual union all
select '06','Seeds' , date'2018-01-10', 3 from dual union all
select '07','Veggie', null , 4 from dual union all
select '08','Veggie', date'2018-01-11', 5 from dual union all
select '09','Veggie', null , 5 from dual union all
select '10','Fruit' , date'2018-01-12', 5 from dual union all
select '11','Fruit' , null , 5 from dual union all
select '12','Nuts' , date'2018-01-15', 6 from dual union all
select '13','Seeds' , date'2018-01-22', 6 from dual union all
select '14','Nuts' , null , 7 from dual
)
select T1_ID
from T2
group by T1_ID
having sum(decode(Category,'Veggie',1,'Fruits',1,0)*nvl2(Date_Distributed,1,0))=0
order by T1_ID;
T1_ID
-----
2
3
4
6
7
Между прочим, нет необходимости объединяться с T1
. Если вы хотите использовать таблицу T1
, строку from T2
можно заменить на from T1 join T2 on T1.ID = T2.T1_ID
.
Rextester Demo kbd>
Необходимо использовать VBA, чтобы сделать это. Если Вы открываете VBA, создаете новый Модуль и вводите функцию
Public Function BITXOR(x As Long, y As Long)
BITXOR = x Xor y
End Function
Можно затем использовать DEC2BIN и BIN2DEC для преобразования от двоичного файла до десятичного числа для выполнения этой функции. Например:
Ячейка A1 = 0111010
Ячейка A2 = 0101011
=DEC2BIN(BITXOR(BIN2DEC(A1),BIN2DEC(A2)))
Можно сделать это с VBA:
Public Function XOR_binary(b1, b2) As String
Dim len_b1
Dim len_b2
Dim len_diff
Dim i
Dim bit1
Dim bit2
' see if the two string are the same length. If not, add 0's to
' the beginning of the shorter string
len_b1 = Len(b1)
len_b2 = Len(b2)
len_diff = len_b1 - len_b2
Select Case len_diff
Case Is < 0
' b2 is longer
b1 = String(Abs(len_diff), "0") & b1
Case Is = 0
' they're the same length
Case Is > 0
' b1 is longer
b2 = String(len_diff, "0") & b2
End Select
XOR_binary = ""
For i = Len(b2) To 1 Step -1
bit1 = CInt(Mid(b1, i, 1))
bit2 = CInt(Mid(b2, i, 1))
XOR_binary = CInt(bit1 Xor bit2) & XOR_binary
Next i
End Function
Вероятно, не лучшая реализация, но это работает.
Используя Ваш пример, A3
содержит:
=XOR_Binary(A1,A2)
Получившая строка будет иметь то же число битов как самая длинная строка, в которой Вы передаете.
=1-(A1 <> 0) + (A2 <> 0) для каждого бита.
Можно разделить его на отдельные столбцы для вышеупомянутой формулы с помощью этого: =MID (A1|7|1) =MID (A1|6|1) =MID (A1|5|1) =MID (A1|4|1) =MID (A1|3|1) =MID (A1|2|1) =MID (A1|1|1)...