2010-10-22 75 views
1

我有数据如下跳过行基于数据

DECLARE @tmp TABLE(cid int, colspan int, rowspan int, corder int) 
INSERT INTO @tmp 
SELECT 1,2,null,1 
UNION 
SELECT 2,null,null,2 
UNION 
SELECT 3,null,null,3 
UNION 
SELECT 4,3,null,4 
UNION 
SELECT 5,null,null,5 
UNION 
SELECT 6,null,null,6 
UNION 
SELECT 7,null,null,7 

我要查询返回

cid colspan rowspan corder 
------------------------------------- 
1  2  null  1 
3  null null  3 
4  3  null  4 
7  null null  7 

的记录将通过科德使用合并单元格值跳到下一个记录(被排序,然后如果colspan = 2跳过下一个1,如果3跳过下一个2)。这可能使用查询吗?

为什么我想这个数据 - 我想这个数据中继控制(表模板)绑定来创建动态表,当有合并单元格> 0,我不希望我的中继器生成TD项目,使其将正确跨度。

+3

太多很容易做这种东西的代码,而不是为sql – 2010-10-22 01:30:27

回答

3

因为(@Sam藏红花在评论中说的)这的确是非常非常容易做这种在程序代码的东西,它意味着你的表的设计不适合SQL。

在SQL数据库中,每行应该描述单个实体(或实体间的单个关系)。如果一个足够常见的设计缺陷就不这样做。例如,考虑这个工资表:

CREATE TABLE Payroll 
(
employee_number CHAR(10) NOT NULL 
    REFERENCES Personnel (employee_number), 
effective_date DATE NOT NULL, 
salary_amount DECIMAL(19, 4) NOT NULL 
    CHECK (salary_amount >= 0), 
UNIQUE (effective_date, employee_number) 
); 

INSERT INTO Payroll (employee_number, effective_date, salary_amount) 
    VALUES ('U83GHVPSGP', '2001-01-01', 5000), 
      ('U83GHVPSGP', '2002-01-01', 7000), 
      ('U83GHVPSGP', '2002-01-01', 9000); 

这里的问题是,它是模拟时期,但每个时期的结束日期从另一行的开始日期dervied即实体(即工资单期)使用建模两行和每个开始日期在数据库中扮演两个角色。一个副作用是一个简单的查询,例如“给我工期员工U83GHVPSGP支付5000 MNT”是非平凡的(从实施的角度来看,它将涉及一个相关的子查询,它可能在给定的SQL平台)。上表将出现非明显的异常情况,例如删除U83GHVPSGP接收到7000 MNT的行将隐含地改变另一行上的数据,即现在看起来像U83GHVPSGP被支付5000 MNT直到'2002-01-01'为止,但实际上并非如此。

事实上,你有一个名为rowspan的专栏是我见过的这种设计缺陷的“气味”最完美的例子。

我并不是说听起来很刺耳。您的表格无疑对过程代码非常有意义,因此请使用过程代码而不是SQL。

SQL在基于集合的解决方案中效果最好,所以如果你想使用SQL,那么考虑重新设计你的表来模拟实体之间关系的单独表中的实体,并确保表的两种风格不会分裂单个实体的关系跨多行的数据。

+0

你可以给我表设计的一个小例子吗?我仍然不清楚 – 2010-10-22 15:01:00

1

尝试使用递归CTE,就像这样:

with cte as (
select t.* from @tmp t where corder = 1 
union all 
select t.* from @tmp t join cte c on t.corder = (c.corder + coalesce(c.colspan,1)) 
) 
select * from cte 
+0

当corder没有按顺序时,它不工作例如:将cid 4到5更改为corder,cid,corder更改为4。 – 2010-10-22 15:15:27

+0

@rs,您的问题明确指出“记录将由corder订购”。如果你想改变这个问题,那么请改变这个问题。 – 2010-10-22 15:32:32

+0

对不起,我的不好,是的,当我点他们时,它的作品。我在想别的东西。 – 2010-10-22 15:40:10