Sql server 如何从表中成对选择记录

Sql server 如何从表中成对选择记录,sql-server,join,Sql Server,Join,这真是一种奇怪的情况。我需要将两个记录配对到一个记录中,作为项目1和项目2。有人能帮我吗?? 这是我的设想 Table ----- ItemID ItemName ItemPrice -------------------------- 1 Item 1 1500 2 Item 2 500 3 Item 3 520 4 Item 4 2500 5 Item 5 1400 我需要把整张桌子分成两半,然后把

这真是一种奇怪的情况。我需要将两个记录配对到一个记录中,作为项目1和项目2。有人能帮我吗?? 这是我的设想

Table
-----
ItemID  ItemName ItemPrice
--------------------------
1       Item 1    1500
2       Item 2    500
3       Item 3    520
4       Item 4    2500
5       Item 5    1400
我需要把整张桌子分成两半,然后把它配对成一对

Result
----------
 ItemID1  ItemName1  ItemPrice1  ItemID2  ItemName2  ItemPrice2
 1        Item 1     1500        2        Item 2     500
 3        Item 3     520         4        Item 4     2500
 5        Item 5     1400        --        --        --

我试着完全加入。但它与项目不匹配。我相信我们可以用COLESCE来做。但是,我不知道如何用一张桌子来做。我正在尝试。我在评论中写道,你应该强烈地考虑这是否是一个UI任务的RDBMS任务,但是无论如何,这可能对你有用:

SELECT odd.*, even.*
FROM MyTable odd LEFT JOIN MyTable even
  ON odd.ItemID == even.ItemID - 1
WHERE odd.ItemID % 2 = 1

正如我在评论中所写的,您应该强烈地考虑这是否是UI任务的RDBMS任务,但无论如何,这可能对您有用:

SELECT odd.*, even.*
FROM MyTable odd LEFT JOIN MyTable even
  ON odd.ItemID == even.ItemID - 1
WHERE odd.ItemID % 2 = 1

您可以使用行号来完成此操作:

select
  max(case when COL = 1 then ItemID end) as ItemID1,
  max(case when COL = 1 then ItemName end) as ItemName1,
  max(case when COL = 1 then ItemPrice end) as ItemPrice1,
  max(case when COL = 0 then ItemID end) as ItemID2,
  max(case when COL = 0 then ItemName end) as ItemName2,
  max(case when COL = 0 then ItemPrice end) as ItemPrice2
from
(
  select
    row_number() over (order by ItemID asc) % 2 as COL,
    (row_number() over (order by ItemID asc) + 1) / 2 as ROWGRP,
    ItemID,
    ItemName,
    ItemPrice
  from
    table1
) X
group by 
  ROWGRP
第一个行号%2分配列,第二个行号+1将新创建的行分配到新行(1,1,2,2,3,3…),以便数据可以按它分组


例如,在

中,您可以使用行编号来执行此操作:

select
  max(case when COL = 1 then ItemID end) as ItemID1,
  max(case when COL = 1 then ItemName end) as ItemName1,
  max(case when COL = 1 then ItemPrice end) as ItemPrice1,
  max(case when COL = 0 then ItemID end) as ItemID2,
  max(case when COL = 0 then ItemName end) as ItemName2,
  max(case when COL = 0 then ItemPrice end) as ItemPrice2
from
(
  select
    row_number() over (order by ItemID asc) % 2 as COL,
    (row_number() over (order by ItemID asc) + 1) / 2 as ROWGRP,
    ItemID,
    ItemName,
    ItemPrice
  from
    table1
) X
group by 
  ROWGRP
第一个行号%2分配列,第二个行号+1将新创建的行分配到新行(1,1,2,2,3,3…),以便数据可以按它分组



你是对的,这是一个奇怪的情况。这不是RDBMS应该使用的。有什么特别的原因吗?@Amit,没错。我不需要那样储存。仅仅是为了某些特定的目的而选择记录。我在问题中的意思是,你是否可以花点钱来解释你为什么需要这些记录。这感觉像是一个错误,我怀疑你把UI和数据混淆了,RDBMS不是关于UI的(顺便说一句,做起来并不难:-)。你需要每一对吗?比如1+2,2+1,1+3,3+1等等?或者只是按递增的顺序?您是否需要在数据库中进行另一个查询,或者只需要在表示层(用户界面)上使用它?如果是后者,那么您通常最好在表示层执行。您是对的,这是一种奇怪的情况。这不是RDBMS应该使用的。有什么特别的原因吗?@Amit,没错。我不需要那样储存。仅仅是为了某些特定的目的而选择记录。我在问题中的意思是,你是否可以花点钱来解释你为什么需要这些记录。这感觉像是一个错误,我怀疑你把UI和数据混淆了,RDBMS不是关于UI的(顺便说一句,做起来并不难:-)。你需要每一对吗?比如1+2,2+1,1+3,3+1等等?或者只是按递增的顺序?您是否需要在数据库中进行另一个查询,或者只需要在表示层(用户界面)上使用它?如果是后者,那么您通常最好在表示层中这样做。您如何知道ItemID中没有间隙?如果从数据样本和注释中删除ItemID=2的行会怎么样?当然,正如我们都说的,这可能是一个错误的任务,无论如何,您知道ItemID中没有间隙吗?如果从数据样本和注释中删除ItemID=2的行会怎么样?当然,正如我们都说的,这可能是一个错误的任务,无论如何,您可以进行简单的自连接,将偶数行连接到奇数行。看看@Amit@SQLPolice的解决方案,它只有在ids中没有任何漏洞时才起作用,这就是我在那里评论的;)但是你可以做一个CTE,然后用CTE进行自连接。@SQLPolice是的,将行号添加到CTE中,然后再将其连接回自身,但你也可以使用group by和max:)@MartinSmith啊,你的意思是他很少投票。你可以做一个简单的自连接,连到奇数行。看看@Amit@SQLPolice的解决方案,它只有在ids中没有任何漏洞时才起作用,这就是我在那里评论的;)但是你可以做一个CTE,让自己加入到CTE中。@SQLPolice是的,把行号加入到CTE中,然后再加入到它自己中,但是你也可以使用group by和max:)@MartinSmith啊,你的意思是他很少投票。