【问题标题】:oracle sql pivot is grouping my dataoracle sql pivot 正在对我的数据进行分组
【发布时间】:2017-05-02 02:20:59
【问题描述】:

我在使用数据透视创建查询时遇到问题。 我有一个有 4 列的表

col1 | col2 | col3 | col4
1    | 1    |   5  | 2
1    | 2    |   6  | 2
1    | 3    |   7  | 2
1    | 4    |   8  | 2
1    | 1    |   5  | 2
1    | 2    |   6  | 2
1    | 3    |   7  | 2
1    | 4    |   8  | 2

我正在使用 pivot,所以我可以输出这样的项目:

col1 | col2 | col3

这是查询:

select col1, "1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"
from (
   select col1, col2, col3
   from tbl
   where col4 = 2
)
pivot 
(
   max(col2)
   for col3
   in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
)

代码一直有效,除非我在数据库中有 2 条相同的记录。然后它分组并显示为一个。我想将其输出为 2 个单独但相同的行。我看到的最简单的解决方法是在表中包含另一列作为 ID。但是因为我不会在其他任何地方使用这个 ID,所以我认为这有点毫无意义,而且稍微更改代码会更容易,工作量也更少。

上面的代码输出如下:

1 5 6 7 8 9

我想要这样:

1 5 6 7 8 9
1 5 6 7 8 9

【问题讨论】:

  • 你是对的;您将需要一个额外的列来确定数据的子集。这可能只是一个 row_number() 用于将所有行分组为“(col1, col2, col3) 值的第一行,(col1, col2, col3) 值的第二行等”
  • 请选择一个 DBMS(Sql Server 或 Oracle),或者您的问题对任何一个都有效?
  • @Boneist 是的,这似乎是最好的主意。

标签: sql oracle pivot


【解决方案1】:

使用ROW_NUMBER() 分析函数添加另一列:

SELECT *
FROM   ( SELECT t.*,
                ROW_NUMBER() OVER ( PARTITION BY col1, col2, col3, col4
                                    ORDER BY ROWNUM ) AS rn
         FROM   tbl t )
PIVOT  ( MAX( Col2 ) FOR Col3 IN ( 1,2,3,4,5,6,7,8,9,10 /* ..., 24*/ ) );

输出

COL1 COL4 RN 1 2 3 4 5 6 7 8 9 10
---- ---- -- - - - - - - - - - --
   1    2  1         1 2 3 4
   1    2  2         1 2 3 4

【讨论】:

  • 感谢您的回答。我通过在表中添加另一列作为 ID 解决了这个问题。然后我的解决方案有效。还是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多