首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL查询将后面的两行求和为一行

使用SQL查询将后面的两行求和为一行
EN

Stack Overflow用户
提问于 2012-05-04 23:54:59
回答 3查看 146关注 0票数 0

我是SQL的初学者,我在SQL方面有以下问题。

我需要一个SQL查询,它可以计算字段idpersone中具有相同值的两个连续行之间的差异,并将它们重新分组到一行中。

例如,我需要将我的表转换为所需的数据,如下所示:

代码语言:javascript
复制
Table data:
idLigne | idperson | statut
--------|----------|-------
   L1         1         A
   L2         1         B
   L3         1         A
   L4         1         B
   L5         2         A
   L6         2         B
   L7         3         A
   L8         3         B

Desired output: 
idLigne | idpersonne | firstLighe | secondLigne
--------|------------|------------|------------
 L2-L1         1           L1           L2
 L4-L3         1           L3           L4
 L6-L5         2           L5           L6
 L8-L7         2           L7           L8
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-05 00:15:01

您可以尝试如下所示:

代码语言:javascript
复制
DECLARE @MyTable TABLE(idLigne VARCHAR(2), idperson INT, statut CHAR(1));

INSERT INTO @MyTable VALUES ('L1',1,'A')
, ('L2',1,'B')
, ('L3',1,'A')
, ('L4',1,'B')
, ('L5',2,'A')
, ('L6',2,'B')
, ('L7',3,'A')
, ('L8',3,'B')

; WITH a AS (
    SELECT idLigne=t2.idLigne+'-'+t1.idLigne
    , idpersonne=t1.idperson
    , firstLigne=t1.idLigne
    , secondLigne=t2.idLigne
    , r1=ROW_NUMBER()OVER(PARTITION BY t1.idLigne ORDER BY t2.idLigne)
    , r2=ROW_NUMBER()OVER(PARTITION BY t2.idLigne ORDER BY t1.idLigne)
    FROM @MyTable t1
    INNER JOIN @MyTable t2 ON t1.idperson=t2.idperson AND t1.statut='A' AND t2.statut='B'
)
SELECT idLigne
    , idpersonne
    , firstLigne
    , secondLigne
FROM a WHERE r1=r2
GO

结果:

票数 1
EN

Stack Overflow用户

发布于 2012-05-05 00:01:32

简单的解决方案是这样的……

如果同一个idperson有三个记录,我不确定您想要做什么。或者,如果序列记录具有不同的idperson,该怎么办。

代码语言:javascript
复制
WITH
  sequenced_data
AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY idperson ORDER BY idLigne) AS sequence_id,
    *
  FROM
    myTable
)
SELECT
  *
FROM
  myTable as firstLigne
LEFT JOIN
  myTable as secondLigne
    ON  secondLigne.idperson    = firstLigne.idperson
    AND secondLigne.sequence_id = firstLigne.sequence_id + 1
WHERE
  (firstLigne.sequence_id % 2) = 1
票数 3
EN

Stack Overflow用户

发布于 2012-05-05 11:45:20

我不能准确地推断出你的问题的意图。但它是这样的:

代码语言:javascript
复制
with a as
(
   select *, 
     (row_number() over(order by idLigne, idperson) - 1) / 2 as pair_number 
   from tbl
)
select 
   max(idligne) + '-' + min(idligne) as idLigne, 
   min(idperson) as idpersonne,
   min(idLigne) as firstlighe, max(idLigne) as secondLigne       
from a
group by pair_number

输出:

代码语言:javascript
复制
IDLIGNE IDPERSONNE  FIRSTLIGHE  SECONDLIGNE
L2-L1   1           L1          L2
L4-L3   1           L3          L4
L6-L5   2           L5          L6
L8-L7   3           L7          L8

实时测试:http://www.sqlfiddle.com/#!3/26371/20

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10452173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档