Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Oracle pivot到SQL server的转换_Sql_Sql Server_Oracle_Pivot - Fatal编程技术网

Oracle pivot到SQL server的转换

Oracle pivot到SQL server的转换,sql,sql-server,oracle,pivot,Sql,Sql Server,Oracle,Pivot,简短的问题,不太熟悉SQL server,但我在oracle SQL server中有多个聚合的查询 多个聚合的sql server等效查询是什么 Oracle代码: [SELECT * FROM (SELECT d.loc_area, d.loc_rack, d.loc_height, d.loc_place, d.locvrc,

简短的问题,不太熟悉SQL server,但我在oracle SQL server中有多个聚合的查询

多个聚合的sql server等效查询是什么

Oracle代码:

[SELECT *
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn_pivot
           FROM (select locvrc,
                        SUBSTR(stoloc, 0, 2) loc_area,
                        SUBSTR(stoloc, 4, 2) loc_rack,
                        SUBSTR(stoloc, 6, 1) loc_place,
                        SUBSTR(stoloc, -2) loc_height
                   FROM locls) d)
  PIVOT (MAX(loc_height) AS EXT, MIN(locvrc) AS UNIQ FOR rn_pivot IN ('1' AS HEIGHT_1, '2' AS HEIGHT_2, '3' AS HEIGHT_3, '4' AS HEIGHT_4))
  ORDER BY LOC_AREA,
        LOC_RACK,
        LOC_PLACE]
SQL Server:

SELECT *
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn_pivot
           FROM (select locvrc,
                        SUBSTRing(stoloc, 0, 2) loc_area,
                        SUBSTRing(stoloc, 4, 2) loc_rack,
                        SUBSTRing(stoloc, 6, 1) loc_place,
                        right(stoloc, 2) loc_height
                   FROM locls) d) A
  PIVOT (MAX(loc_height) FOR rn_pivot IN ([1],[2],[3],[4])) P1 
这很好,但我还需要另一个骨料|(MIN(locvrc)|

提前谢谢你

溴 一月

/编辑

原始表格:

 Stoloc          locvrc
 5D-32A-00       699787
 5D-32A-10       439567
 5D-32A-20       429456
 5D-32A-30       122172
 5D-32B-00       328311
 5D-32B-10       247422
 5D-32B-20       133244
 5D-32B-30       464978
子字符串后的表:

loc_area loc_rack loc_place loc_height locvrc
 5D         32       A        00       699787
 5D         32       A        10       439567
 5D         32       A        20       429456
 5D         32       A        30       122172
 5D         32       B        00       328311
 5D         32       B        10       247422
 5D         32       B        20       133244
 5D         32       B        30       464978
我对Oracle的看法是:

loc_area loc_rack loc_place Height1 Uniq1   Height2 Uniq2   Height3 Uniq3 Height4 Unique4
5D       32        A         00     699787    10    439567    20    429456    30   122172
5D       32        B         00     328311    10    247422    20    133244    30   464978

因此,从原始表中,stoloc将被切割成不同的列。在这之后,一行将是area、rack、place,并将它们放在一行高度和locvrc中。我已经在Oracle数据库中完成了这项工作,但不知道如何在SQl server中完成。不需要这种解决方案,任何解决方案都可以。

您可能会觉得奇怪,但根据我的知识wledge这是我们在
SQL server
中实现的方法

我们需要为相同的pivot列创建另一个维度,方法是向其添加任何内容,并将其放入
pivot
子句中

如您所见,我添加了
1
,并创建了另一列用于
locvrc

SELECT *
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn_pivot,
                cast(row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) as varchar) + '1' rn_pivot_locvrc
           FROM (select locvrc,
                        SUBSTRing(stoloc, 0, 2) loc_area,
                        SUBSTRing(stoloc, 4, 2) loc_rack,
                        SUBSTRing(stoloc, 6, 1) loc_place,
                        right(stoloc, 2) loc_height
                   FROM locls) d) A
  PIVOT (MAX(loc_height) FOR rn_pivot IN ([1],[2],[3],[4])) P1
  PIVOT (MAX(locvrc) FOR rn_pivot_locvrc IN ([11],[21],[31],[41])) P2
另外,我的目的是告诉您如何
PIVOT
multi-columns-abut不幸的是,我当然无法验证结果集

编辑:-使用Op的实际数据更新查询

使用
聚合
案例
也可以实现

SELECT loc_area,loc_rack,loc_place
      ,max(case when rn = 1 then loc_height end) height_1
      ,max(case when rn = 1 then locvrc end) unique_1
      ,max(case when rn = 2 then loc_height end) height_2
      ,max(case when rn = 2 then locvrc end) unique_2
      ,max(case when rn = 3 then loc_height end) height_3
      ,max(case when rn = 3 then locvrc end) unique_3
      ,max(case when rn = 4 then loc_height end) height_4
      ,max(case when rn = 4 then locvrc end) unique_4
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn
           FROM (select locvrc,
                        SUBSTRing(stoloc, 0, 2) loc_area,
                        SUBSTRing(stoloc, 4, 2) loc_rack,
                        SUBSTRing(stoloc, 6, 1) loc_place,
                        right(stoloc, 2) loc_height
                   FROM locls) d) A
group by loc_area,loc_rack,loc_place;

提供示例数据、所需结果以及代码应执行的操作的清晰解释。添加了更多信息。如果仍然缺少,请告诉我。-Jan示例表中的列名与列不符(
stoloc
)在queryI中我知道这是混乱的。我需要编辑整个新帖子以便于帮助。我认为会有简单的解决方案,如“添加此内容”:@Jan00,更新,现在应该给出正确的结果:)是的,你是对的,因为你还有其他专栏,如
d.loc_区域,d.loc_框架,d、 loc_place
,您没有旋转它,它可能会影响结果集。而且,我在您最初的查询中没有看到
columnA ColumnB
,我没有看到您Sujitmohanty30的回复。能够运行查询,正如您所提到的,无法验证结果,并且不完全正确。但方向是正确的。@Jan00,我意识到我刚才纠正的问题中有一个错误,这可能是原因,但我不确定我自己看到了,也纠正了,但不是那样。但我会更好地编辑帖子,这样更容易提供帮助,我知道在示例和查询中使用不同的列名会有点混乱。我知道现在引入额外维度也会改变输出,为了解决这个问题,我们需要聚合最终结果。我已经使用您发送的示例设置了查询。你能看看它是否对你有帮助吗。
SELECT loc_area,loc_rack,loc_place
      ,max(case when rn = 1 then loc_height end) height_1
      ,max(case when rn = 1 then locvrc end) unique_1
      ,max(case when rn = 2 then loc_height end) height_2
      ,max(case when rn = 2 then locvrc end) unique_2
      ,max(case when rn = 3 then loc_height end) height_3
      ,max(case when rn = 3 then locvrc end) unique_3
      ,max(case when rn = 4 then loc_height end) height_4
      ,max(case when rn = 4 then locvrc end) unique_4
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn
           FROM (select locvrc,
                        SUBSTRing(stoloc, 0, 2) loc_area,
                        SUBSTRing(stoloc, 4, 2) loc_rack,
                        SUBSTRing(stoloc, 6, 1) loc_place,
                        right(stoloc, 2) loc_height
                   FROM locls) d) A
group by loc_area,loc_rack,loc_place;