如何解决Oracle枢轴转换到SQL Server
简短的问题,对sql Server不太熟悉,但是我在oracle 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
也可以使用aggregation
和case
,
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 举报,一经查实,本站将立刻删除。