Прошло много времени с тех пор, как я использовал SQLServer 2000, но это, вероятно, будет работать.
select cltkey, acctkey,
max( case when trantypeid = 10 and access = 1
then 1 else 0 end ) as hastrantypeid1,
max( case when trantypeid = 11 and access = 1
then 1 else 0 end ) as hastrantypeid2,
max( case when trantypeid = 12 and access = 1
then 1 else 0 end ) as hastrantypeid3
from table
group by cltkey, acctkey;
Если нет, попробуйте это:
create view has_access as
select cltkey, acctkey,
max( case when trantypeid = 10 and access = 1
then 1 else 0 end ) as hastrantypeid1,
max( case when trantypeid = 11 and access = 1
then 1 else 0 end ) as hastrantypeid2,
max( case when trantypeid = 12 and access = 1
then 1 else 0 end ) as hastrantypeid3
from table;
, а затем получите результаты этого
select cltkey, acctkey,
max( hastrantypeid1) as hastrantypeid1,
max( hastrantypeid2 ) as hastrantypeid2,
max( hastrantypeid2 ) as hastrantypeid2
from has_access
group by cltkey, acctkey;
Обратите внимание, что это скажет вамacctkey) имеет доступ (определенного типа), если любая строка для этого набора (cltkey, acctkey) имеет доступ для этого конкретного типа.То есть, по сути, это рядный OR
.
Если все строки для этого кортежа должны иметь доступ, чтобы этот кортеж имел доступ, то есть, если вы хотите AND
для строк, вам нужно сделать это:
min( case when trantypeid = 10
then case when access = 1
then 1 else 0 end else null end) as hastrantypeid1,
etc.