在没有光标的表中连续行之间进行分组

时间:2011-06-29 03:57:51

标签: sql sql-server-2005

我试图在没有光标的情况下在两行之间完成分组,有人可以帮我注册这个

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

我想要这样的输出

Col1  Col2
----  ----
1-2   50
2-3   70

4 个答案:

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

如果您可能缺少行,则可能需要更复杂。

答案 1 :(得分:1)

如果你不想重复行(1-2,2-3)并且你可以预期会有一些缺失的id(如果你有一个标识字段那么正常),这是一个棘手的问题。 / p>

试试这个:

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 

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

答案 3 :(得分:0)

你也可以测试以下查询...

我的机器中有oracle,这就是我可以运行并只说oracle查询的原因..

请检查这是否也适用于sql server并告诉我有关...

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;

在oracle lag()函数中用于获取最后一行的值..如果它是第一行,那么这个函数将给出空值..这样通过在空值上应用加法,你将只得到null

通过这个概念,我们将获得所需的输出......