Sql 在Oracle中将两行放在同一行上
让我们以这个表为例,它将一个产品与数字相关联 他从客户反馈中收到的星星数恰好是按星星数订购的:Sql 在Oracle中将两行放在同一行上,sql,oracle,Sql,Oracle,让我们以这个表为例,它将一个产品与数字相关联 他从客户反馈中收到的星星数恰好是按星星数订购的: | ProductID | Stars | |-----------|---------| | 23 | 10 | | 12 | 10 | | 17 | 9 | | 5 | 8 | | 20 | 8 | | 18 | 7 | 如何选择在同
| ProductID | Stars |
|-----------|---------|
| 23 | 10 |
| 12 | 10 |
| 17 | 9 |
| 5 | 8 |
| 20 | 8 |
| 18 | 7 |
如何选择在同一行上显示产品的ID
成对的
像这样:
| Product1 | Product2 |
|-----------|-------------|
| 23 | 12 |
| 17 | 5 |
| 20 | 18 |
或者像这样:
| Products |
|------------------|
| 23 12 |
| 17 5 |
| 20 18 |
SELECT Stars as StarCount, LISTAGG(ProductID, ' ') WITHIN GROUP (ORDER BY ProductID) As ProductList
FROM Table
GROUP BY Stars
使用Listag生成选项2
select stars, listagg(ProductID, ' ') within group (order by ProductID) as Products
from Table1
group by Stars
在oracle上,您可以使用函数调用listagg,其工作原理类似于C和其他语言中的join。要想让它发挥作用,你需要有一些东西可以团购——当你按某个栏目订购时,似乎你想每隔一个栏目进行一次团购。首先为列创建一个行号,然后按该div 2分组 所以 如果你想每做3次,就用/3代替 更有趣的是,越来越多的人希望看到它,因为它得到了每一个星星数量的列表,如下所示:
| Products |
|------------------|
| 23 12 |
| 17 5 |
| 20 18 |
SELECT Stars as StarCount, LISTAGG(ProductID, ' ') WITHIN GROUP (ORDER BY ProductID) As ProductList
FROM Table
GROUP BY Stars
当然,这看起来像是一个事先的答案,因为这是人们期望你想要的。不清楚为什么你在20之前的输出中选择了5;请记住,表中的行不是按顺序排列的。在我的解决方案中,我先按星星排序,然后按产品ID排序;如果您的行也是由其他内容排序的,那么您可以使用它 如果要一次对7个值进行分组,可以将分区中的2更改为7 这只是为了表明这可以在数据库中的Oracle SQL中完成。不应该,但这由你决定
with
inputs ( productid, stars) as (
select 23, 10 from dual union all
select 12, 10 from dual union all
select 17, 9 from dual union all
select 5, 8 from dual union all
select 20, 8 from dual union all
select 18, 7 from dual
)
-- end of test data, solution begins below
select listagg(productid, ' ') within group (order by rn) as result
from ( select productid, stars,
row_number() over (order by stars desc, productid desc) as rn
from inputs
)
group by ceil(rn/2)
order by ceil(rn/2)
;
RESULT
------
23 12
17 20
5 18
结果
23 12
17 5
20 18
不要使用数据库引擎为您提供特定格式;它属于连接到它的应用程序的域,然后以良好的格式呈现信息。您如何将它们配对?只需按stars desc、id desc排序?交替使用?为什么标题上写着“两个或更多”?您需要知道将生成多少列,或者必须动态生成。正如trincot所说,这听起来像是你的应用程序应该为显示而做的事情。在本例中,我按stars desc排序。标题显示了两行或更多行,因为我可以想象同样的技术可以用于不止一行的工作。也许标题有点混乱,我会更改它。OP的要求显然不是按星星分组。你应该使用ceil而不是floor-使用floor,你只能在第一个列表中得到n-1个值,然后一次得到n个值。更糟糕的是,-您是否在组内排序,并在外部查询中按相同的表达式分组?SQL 101.ah关于地板的观点很好,我添加了1。我不确定我会调用另一个拼写错误SQL101:DI没有看到拼写错误。我看到组内的顺序是GroupByMe,但您使用相同的表达式进行分组。所以GroupByMe在每个组中都是常量。除非其中一个是打字错误:-我相信你知道正确的意思-一个新手犯了这个错误,我认为他们不知道更好;一个有经验的球员会犯这样的错误,我认为他们会不假思索地匆忙给出答案。我认为这对社区没有好处。我尽我所能去呼吁这样的例子;事实上,很多新手都被这种错误弄糊涂了,然后他们100%肯定地记得他们看到一个非常有经验的人这样写。很抱歉,如果我被认为是卑鄙的,不是故意的-但我确实想指出这一点,正如我所知道的那样。你也一样!干杯我看到了反对票,但没有解释。答案有问题吗?如果你不留个条子,我们怎么知道呢?我觉得这很正确,为什么要投否决票?我投了一票