Oracle pivot到SQL server的转换
简短的问题,不太熟悉SQL server,但我在oracle SQL server中有多个聚合的查询 多个聚合的sql server等效查询是什么 Oracle代码: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,
[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;