如何为此案例创建条件?

时间:2016-03-17 07:54:17

标签: sql sql-server conditional-statements

样本表:

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_code7000/000开始,并为每个Exttype分隔/分区。

例如:我们从MA的exttype开始,基于其acclevel(可能是2或更多)直到下一个exttype。

我们的想法是按SELECT FROM tmp_acc_list WHERE acc_code BETWEEN @start_acc_code获取制造帐户(7000 /在这种情况下为000)AND @end_acc_code(下一个exttype之前的数据)

  • 我不知道什么是exttype,我还在学习表格。

我们如何从此示例表中创建@end_acc_code部分?

2 个答案:

答案 0 :(得分: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'

这是你需要的吗?

答案 1 :(得分: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