微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle枢轴转换到SQL Server

如何解决Oracle枢轴转换到SQL Server

简短的问题,对sql Server不太熟悉,但是我在oracle sql server中查询了多个聚合。

什么是sql Server等效查询多个聚合?

Oracle代码

[42,25,16,255]

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_place
                                   ORDER BY d.loc_height) rn_pivot
           FROM (select locvrc,SUBSTR(stoloc,2) loc_area,4,2) loc_rack,6,1) loc_place,-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]

这工作正常,但我还需要另一个聚合|(MIN(locvrc)|

提前谢谢!

溴 扬

/编辑

原始表:

SELECT *
   FROM (SELECT d.loc_area,SUBSTRing(stoloc,right(stoloc,2) loc_height
                   FROM locls) d) A
  PIVOT (MAX(loc_height) FOR rn_pivot IN ([1],[2],[3],[4])) P1 

子字符串后的表格:

 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

我对Oracle的了解是

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

因此,在原始表中,stoloc将被切割为不同的列。在这之后的一行中将是区域,机架,位置,并与它们成一行,分别是Height和locvrc。我已经在Oracle数据库中完成了此操作,但是不知道如何在sql服务器中完成此操作。不需要是这种解决方案,任何方法都可以。

解决方法

您可能会发现它很奇怪,但是据我所知,这就是我们如何在SQL server中做到这一点。

我们需要通过添加其他内容并将其放入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_place
                                   ORDER BY d.loc_height) rn_pivot,cast(row_number() OVER(PARTITION BY d.loc_area,d.loc_place
                                   ORDER BY d.loc_height) as varchar) + '1' rn_pivot_locvrc
           FROM (select locvrc,SUBSTRing(stoloc,2) loc_area,4,2) loc_rack,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

P.S。我的目的是告诉您如何PIVOT多列,但是很遗憾,我当然不能验证结果集。

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

SELECT loc_area,loc_rack,loc_place,max([1]) as height_1,max([11]) as unique_1,max([2]) as height_2,max([21]) as unique_2,max([3]) as height_3,max([31]) as unique_3,max([4]) as height_4,max([41]) as unique_4
   FROM (SELECT d.loc_area,[41])) P2
group by loc_area,loc_place

OR

也可以使用aggregationcase

SELECT loc_area,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_place
                                   ORDER BY d.loc_height) rn
           FROM (select locvrc,2) loc_height
                   FROM locls) d) A
group by loc_area,loc_place;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。