2011-06-29 20 views
0

我試圖讓一組2行之間做一個表中連續行之間分組沒有遊標的情況,可有一個人幫我章這個無光標

Col1(int) Col2(int) 
--------- --------- 
1   20 
2   30 
3   40 

我想這樣

Col1 Col2 
---- ---- 
1-2 50 
2-3 70 
輸出
+1

什麼是表結構是怎樣的? –

回答

0

假定COL1是整數

SELECT CAST(a.col1 as VARCHAR(10))+ '-' + CAST(b.col1 as VARCHAR(10)), COALESCE(a.col2,0)+COALESCE(b.col2,0) 
FROM table a 
JOIN table b a.col1 = b.col1 + 1 
+0

更正CAST,貸記給@Bill – niktrs

+0

添加空值數據檢查(COALESCE) – niktrs

+0

查詢不在第一行,結果如此,錯過1-2,但顯示2-3,3-4 – Prabu

1

你確定你不會錯過任何行...

Select cast(a.col1 as varchar(10)) + '-' + cast(b.col1 as varchar(10)) as col1, 
a.col2 + b.Col2 as Col2 
From mytable a 
    Inner Join mytable b on b.col1 = (a.col1 + 1) 

,如果你可能會丟失行,你可能需要更多的COM折襞。

+0

+1。我忘了CAST。 – niktrs

+0

您鍵入了CAST,但語法是CONVERT。使用CAST(列AS類型)或CONVERT(類型,列) – niktrs

0

您可以測試下面的查詢也...

我已經在我的機器oracle的,這就是爲什麼我可以運行,並說只有Oracle查詢..

請檢查這是否也可以在SQL服務器上工作,並告訴我有關...

select * from 
    (Select lag (col1) over (order by col1)|| '-' || col1 as col1 
     col2 + lag (col2) over (order by col1) as Col2 
    From mytable 
    ) 
where col2 is not null; 

in oracle lag()函數用於捕獲最後一行值..如果它是第一行,那麼這個函數將給出空值..因此,通過在null值上應用加法,您將只獲得空值

由此概念,我們將得到所需的輸出...

1

這是一個棘手的,如果你不想重複行(1-2,2-3),你可以期望有一些遺漏的ID(這將是正常如果你有一個身份字段)。

試試這個:

CREATE TABLE #temp (id INT, value INT) 

INSERT INTO #temp 
SELECT 1,2 
UNION ALL 
SELECT 2,8 
UNION ALL 
SELECT 3,8 
UNION ALL 
SELECT 5,19 

SELECT id, value, ROW_NUMBER() OVER (ORDER BY id) AS rownumber 
INTO #temp2 
FROM #temp 

SELECT * FROM #temp2 

SELECT CAST(b.id AS VARCHAR(10)) + '-' + CAST(a.id AS VARCHAR(10)) AS col1, 
    a.value + b.value as Col2 
FROM #temp2 a 
JOIN #temp2 b 
    ON a.rownumber = b.rownumber+1 
WHERE ABS(a.rownumber)%2 = 0