2016-03-17 3 views
0

Пример таблицы:Как создать условие для этого случая?

Id |Acc_Code|Description  |Balance | Acclevel| Acctype| Exttype| 
--- -------- ----------------- |-------- |-------- | -------| -------| 
1 |SA  |Sales    | 0.00 | 1  | SA |  | 
2 |CS  |Cost of Sales  | 0.00 | 1  | CS |  | 
3 |5000/001|Revenue   | 94.34 | 2  | SA |  | 
4 |5000/090|Sales(Local)  | 62.83 | 2  | SA |  | 
5 |7000/000|Manufacturing Acc |-250.80 | 2  | CS | MA  | 
6 |7000/200|Manufacturing Acc | 178.00 | 2  | CS |  | 

Это образец данных временной таблицы, которые будут использованы для вставки в другую временную таблицу, которая будет вычислять данные для отчета о прибылях и убытках (для изготовления только связанных счетов).

В этом случае acc_code для производственных счетов начинается с 7000/000 и разделяется/разбивается на разделы для каждого следующего Exttype.

Например: Мы начинаем с exttype MA и основываясь на его acclevel (может быть 2 или более) до следующего exttype.

Идея мы получаем производственные счета по SELECTFROMtmp_acc_listWHEREacc_codeBETWEEN@start_acc_code (7000/000 в данном случае) AND@end_acc_code (данные до следующего exttype)

  • Я не знаю, что exttype, я все еще изучаю таблицы.

Как мы можем создать часть @end_acc_code из этой таблицы образцов?

+2

вы можете разместить больше данных образцов до следующего набора МА и показать ожидаемый результат – Squirrel

+0

Дело в том, что я не знаю, как 'exttype' должен работать, есть только одна запись, которая имеет exttype 'MA' в реальной таблице. Поэтому для ожидаемых результатов я бы сказал, что вряд ли будут какие-либо данные, может быть, несколько строк вместо обычных 20+ строк. –

+0

. Вы не писали, что это должно быть упорядочено , Также я не вижу, что «acclevel» имеет отношение к чему-то –

ответ

0

Итак, вот все в одном скрипте.

Я создал свой стол для теста:

create table #tmp_acc_list(
    Id numeric, 
    Acc_Code nvarchar(100), 
    Acclevel numeric, 
    Acctype nvarchar(100), 
    Exttype nvarchar(100)); 
GO 

insert into #tmp_acc_list(Id, Acc_Code, Acclevel, Acctype, Exttype) 
select 1 , 'SA', 1,'SA', null union all 
select 2 , 'CS', 1,'CS', null union all 
select 3 , '5000/001', 2,'SA', null union all 
select 4 , '5000/090', 2,'SA', null union all 
select 5 , '7000/000', 2,'CS', 'MA' union all 
select 6 , '7000/200', 2,'CS', null 
; 

Тогда приходит запрос:

with OrderedTable as -- to order the table is Id is not an order 
(
    select 
    t.*, ROW_NUMBER() over (
     order by id asc --use any ordering You need here 
     ) 
     as RowNum 
    from 
    #tmp_acc_list as t 
), 
MarkedTable as -- mark with common number 
(
    select 
    t.*, 
    Max(case when t.Exttype is null then null else t.RowNum end) 
     over (order by t.RowNum) as GroupRownum 
    from OrderedTable as t 
), 
GroupedTable as -- add group Exttype 
(
    select 
    t.Id, t.Acc_Code, t.Acclevel, t.Acctype, t.Exttype, 
    max(t.Exttype) over (partition by t.GroupRownum) as GroupExttype 
    from MarkedTable as t 
) 
select * from GroupedTable where GroupExttype = 'MA' 

Является ли это то, что Вам нужно?

0
select * 
from  
    (
     select Id, Acc_Code 
     from tmp_acc_list 
     where Acc_Code = '7000/000' 
    ) s 
    cross join tmp_acc_list a 
    cross apply 
    (
     select top 1 x.Id, x.Acc_Code 
     from tmp_acc_list x 
     where x.Id  >= a.Id 
     and x.AccLevel = a.AccLevel 
     and x.Acctype = a.Acctype 
     and x.Exttype = '' 
     order by Id desc 
    ) e 
where a.Id between s.Id and e.Id