2011-06-29 22 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