Другое решение вместо Cursoring - PullRequest
0 голосов
/ 28 мая 2010

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

RID; NTRITCode; NTRIId; Parameter; Usage; Rate**

1; CURRENT; 4; Peak; 100; 0.1
1; CURRENT; 4; NonPeak; 200; 0.2

1; PROPOSED; 6; Peak; 100; 0.2
1; PROPOSED; 6; NonPeak; 200; 0.3

1; PROPOSED; 8; Peak; 200; 0.3
1; PROPOSED; 8; NonPeak; 200; 0.5

Как вы можете видеть, есть 2 предложенных набора (ID = 6 и 8). Я хочу как-то отобразить, как это ниже, поэтому каждый набор имеет пару CURRENT и PROPOSED, как показано ниже:

**Sequence; RID; NTRITCode; NTRIId; Parameter; Usage; Rate**

1; 1; CURRENT; 4; Peak; 100; 0.1
1; 1; CURRENT; 4; NonPeak; 200; 0.2
1; 1; PROPOSED; 6; Peak; 100; 0.2
1; 1; PROPOSED; 6; NonPeak; 200; 0.3

2; 1; CURRENT; 4; Peak; 100; 0.1
2; 1; CURRENT; 4; NonPeak; 200; 0.2
2; 1; PROPOSED; 8; Peak; 200; 0.3
2; 1; PROPOSED; 8; NonPeak; 200; 0.5 

Опять же, все, что я могу обдумать, это использовать комбинацию CURSOR и UNION, но есть ли TSQL, который может это сделать?

Спасибо

Ответы [ 3 ]

1 голос
/ 28 мая 2010

Я не уверен, что вам действительно нужен рекурсивный запрос столько же, сколько таблица Numbers / Tally, чтобы получить эквивалентные порядковые номера для значений «CURRENT» и значений «PROPOSED».

With 
    Numbers As 
    (
    Select Row_Number() Over ( Order By C1.object_id ) As Value
    From sys.columns As C1
        Cross Join sys.columns As C2
    )
    , ProposedSequences As
    (
    Select  NTRIId
        , Row_Number() Over ( Order By NTRIId ) As Sequence
    From Table
    Where NTRITCode = 'PROPOSED'
    Group By NTRIId
    )
    , CurrentSequences As
    (
    Select RID, NTRITCode, NTRIId, Parameter, Usage, Rate
        , Numbers.Value As Sequence
    From Table
        Cross Join Numbers
    Where NTRITCode = 'Current'
        And Numbers.Value <= (Select Max(Sequence) From ProposedSequence)
    )
Select Sequence, RID, NTRITCode, NTRIId, Parameter, Usage, Rate
From CurrentSequences
Union All
Select PS.Sequence, T.RID, T.NTRITCode, T.NTRIId, T.Parameter, T.Usage, T.Rate
From ProposedSequences As PS
    Join Table As T
        On T.NTRIId = PS.NTRIId
Order By PS.Sequence, T.NTRITCode
1 голос
/ 28 мая 2010
select row_number() over(PARTITION by c.NTRITCode,c.parameter order by c.NTRITCode, c.ntriid,c.parameter) nb, 
c.* from table c
join (select * from table where NTRITCode='PROPOSED') p 
on c.rid=p.rid and c.parameter=p.parameter
and not(p.NTRIId=c.NTRIId and c.parameter=p.parameter)
order by nb, c.ntriid, c.parameter desc
1 голос
/ 28 мая 2010

возможно, то, что mdma, опубликованная по этому вопросу, может работать для вас. я никогда не думал об этом, но рекурсивный CTE очень интересен. Отправной точкой может быть количество различных «предложенных пар», и тогда оно будет объединяться с самим собой столько раз, сколько необходимо для создания правильного количества «текущих пар»

SQL: как получить все отдельные символы в столбце по всем строкам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...