2010-10-22 54 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