Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中将两行放在同一行上_Sql_Oracle - Fatal编程技术网

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%肯定地记得他们看到一个非常有经验的人这样写。很抱歉,如果我被认为是卑鄙的,不是故意的-但我确实想指出这一点,正如我所知道的那样。你也一样!干杯我看到了反对票,但没有解释。答案有问题吗?如果你不留个条子,我们怎么知道呢?我觉得这很正确,为什么要投否决票?我投了一票