Sql server 如何从表中成对选择记录
这真是一种奇怪的情况。我需要将两个记录配对到一个记录中,作为项目1和项目2。有人能帮我吗?? 这是我的设想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 我需要把整张桌子分成两半,然后把
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啊,你的意思是他很少投票。