2010-05-28 3 views
0

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

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). Я хочу, чтобы как-то показать, как это ниже, так что каждый набор имеет пару ТОКА, а также предложенную следующим образом:

**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, что может это сделать?

Благодаря

+0

есть всегда 2 curent и предложил или она может меняться? – thomas

+1

Я не вижу связи между текущим и предлагаемым. –

+0

@OMG Ponies: Я только что добавил один. См. Таблицу обновлений. – dcpartners

ответ

1

Я не уверен, что вы на самом деле нужен рекурсивный запрос столько, сколько таблица Numbers/Tally, чтобы получить эквивалентные порядковые номера для значений «CURRENT», как значения «ПРЕДЛАГАЕМЫЕ».

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 
+0

Я пытаюсь понять этот запрос. Я не совсем понимаю, почему это делают Нюмберс? Однако последовательность кажется неправильной. В моем запросе было возвращено количество записей последовательности для «ПРЕДЛАГАЕМОГО», поэтому в моем случае у меня будет 4 (1, 2, 3, 4). Разве это не просто 2, потому что это группировка NTRIId? – dcpartners

+0

@ dewacorp.alliances- Я немного изменил свой запрос. Таблица 'Numbers' - это просто последовательный список целых чисел. Он обеспечивает эквивалентную последовательность для «текущих» значений, которые создаются для «предлагаемых» значений. Вместо этого я мог бы создать Cross Join для пересмотренного ProposedSequences CTE. Короче говоря, мне нужна строка «Current» для каждой последовательности в ProposedSequences. – Thomas

1

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

SQL: how to get all the distinct characters in a column, across all rows

+0

Сделаем такой подход. Спасибо – dcpartners

1
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 
+0

Спасибо за этот запрос. Это намного короче, но у меня немного крутится голова, чтобы понять это. – dcpartners

+0

Я использовал комбинацию CTE и этот запрос и прекрасно работаю. Спасибо – dcpartners

+0

hi @ msi77: Я только что нашел, что этот запрос работает только в том случае, если количество предложенных = 2 (NTRIId) НО, если это больше, чем 2, на самом деле это не так. Есть идеи? – dcpartners

Смежные вопросы