Объединение нескольких строк в один ряд - PullRequest
2 голосов
/ 31 июля 2010

У меня есть таблица, содержащая разрешения для учетной записи пользователя, и я пытаюсь написать запрос для получения одной строки для каждой комбинации учетных записей пользователей.

Вот что у меня есть.

CltKey  AcctKey TranTypeID  Access
10      2499    10          0
10      2499    11          1
10      2499    12          1
10      2764    10          1
10      2764    11          1
10      2764    12          0

Вот то, что я хотел бы получить.

CltKey  AcctKey TranTypeID1 Access1 TranTypeID2 Access2 TranTypeID3 Access3
10      2499    10          0       11        1       12        1
10      2764    10          1       11        1       12        0

Или даже лучше, что-то вроде этого.

CltKey  AcctKey HasTranTypeID1  HasTranTypeID2 HasTranTypeID3
10      2499    0               1              1
10      2764    1               1              0    

Я пытался сделать самообъединение, но продолжаю получатьнесколько строк для каждого TranTypeID.Один с ним равным 0, а другой с ним равным 1. Я также пытался использовать вложенные операторы «Select», но производительность ужасна.У кого-нибудь есть идеи, как это сделать?

Спасибо.

Редактировать: К сожалению, это должно работать в SQL 2000.

Ответы [ 3 ]

2 голосов
/ 31 июля 2010

Прошло много времени с тех пор, как я использовал 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.
1 голос
/ 31 июля 2010
SELECT CltKey, AcctKey,
    MAX(CASE TrantypeId WHEN 10 THEN Access ELSE NULL END) AS HasTranTypeID1,
    MAX(CASE TrantypeId WHEN 11 THEN Access ELSE NULL END) AS HasTranTypeID2,
    MAX(CASE TrantypeId WHEN 12 THEN Access ELSE NULL END) AS HasTranTypeID3
FROM PermissionsTable
GROUP BY CltKey, AcctKey
ORDER BY CltKey, AcctKey
;
0 голосов
/ 01 августа 2010

Использовать PIVOT - Вот пример: http://msdn.microsoft.com/en-us/library/ms177410.aspx

...