Sql 如何在Oracle中创建轴心
如何将下面的查询转换为透视格式?我需要ship date作为行跟踪id作为值,shp,sxm作为列,我只是在查询末尾添加了格式。如果有人能让我知道如何将所有这些转换为pivot格式,我真的是个新手,所以我希望有人能将我的查询转换为pivot而不是任何引用。首先,您似乎缺少完成FROM子句的最终结束别名。你有Sql 如何在Oracle中创建轴心,sql,oracle,pivot,Sql,Oracle,Pivot,如何将下面的查询转换为透视格式?我需要ship date作为行跟踪id作为值,shp,sxm作为列,我只是在查询末尾添加了格式。如果有人能让我知道如何将所有这些转换为pivot格式,我真的是个新手,所以我希望有人能将我的查询转换为pivot而不是任何引用。首先,您似乎缺少完成FROM子句的最终结束别名。你有 FROM ( select statement... ending with columnQuery seen_at_SM1_sort_scan... 需要 接下来,
FROM ( select statement... ending with
columnQuery seen_at_SM1_sort_scan...
需要
接下来,您没有任何组作为轴心的基础来显示每个特定元素的聚合。。。充其量,你需要
GROUP BY
A.ship_date
,CASE A.tracking_id
WHEN FIRST(A.tracking_id) = Q
THEN AM
ELSE Non - AM
END
最后,展示一些你最终希望得到的样本数据可能会有所帮助,即使是假的数据。。。不要在示例输出中使用制表符进行格式设置,因为制表符的格式并不总是很好。您需要这样的内容:
with a as (
select ship_date,
case -- <- modify this part
when tracking_id like 'Q%' then 'Q'
else 'N' end
category,
seen_at_SP1_sort_scan shp1,
seen_at_sm1_sort_scan sxm1,
seen_at_ds_scan sds1
from test -- <- your inner query goes here
)
select ship_date,
count(decode(category, 'Q', shp1)) shp1_a,
count(decode(category, 'N', shp1)) shp1_n,
count(decode(category, 'Q', sxm1)) sxm1_a,
count(decode(category, 'N', sxm1)) sxm1_n,
count(decode(category, 'Q', sds1)) sds1_a,
count(decode(category, 'N', sds1)) sds1_n,
count(decode(category, 'Q', 1)) total_a,
count(decode(category, 'N', 1)) total_n
from a group by ship_date order by ship_date
不是测试放置内部查询,而是从选择o.carrier\u ref\u number开始。。。。
根据您的需要修改类别的零件,这里不清楚您想要什么。
当。。。而不是解码类别。。。如果你的标准更复杂
如果您有Oracle 11g或更高版本,您可以试用
编辑:Oracle 11数据透视版和以前版本的已修改完整查询。
请将底部附近的“20150312”替换为查询中的参数{RUN\u DATE\u YYYYMMDD}
对于Oracle 11:
select ship_date, a_shp1 shp1_a, n_shp1 shp1_n, a_sxm1 sxm1_a, n_sxm1 sxm1_n,
a_shp1+a_sxm1 total_a, n_shp1+n_sxm1 total_n
from (
with ships as (
select ship_date, category, shp1, sxm1
from (
SELECT o.carrier_ref_number tracking_id, o.pkg_manifest_run_date ship_date,
CASE WHEN (o.carrier_ref_number) LIKE 'Q%'
THEN 'A' -- AMZL
ELSE 'N' -- Non-AMZL
END Category,
(SELECT min(transport_shipment_status_date)
FROM transport_shipments ts
JOIN transport_shipment_statuses tss
ON tss.transport_shipment_id=ts.transport_shipment_id
WHERE ts.carrier_ref_number=o.carrier_ref_number
AND tss.ship_status='X4' AND tss.status_node_id='SHP1'
) shp1, --seen_at_SHP1_sort_scan,
(SELECT min(transport_shipment_status_date)
FROM transport_shipments ts
JOIN transport_shipment_statuses tss
ON tss.transport_shipment_id=ts.transport_shipment_id
WHERE ts.carrier_ref_number=o.carrier_ref_number
AND tss.ship_status='X4' AND tss.status_node_id='SXM1'
) sxm1 -- seen_at_SXM1_sort_scan
FROM otm_ob_cust_pkg_records o
WHERE o.pkg_manifest_run_date
BETWEEN to_date('20150312', 'YYYYMMDD') - 10
AND to_date('20150312', 'YYYYMMDD')
) A
where shp1 is not null or sxm1 is not null)
select * from ships
pivot (count(shp1) as shp1, count(sxm1) as sxm1
for (category) IN ('A' AS a, 'N' AS n))
) order by ship_date
对于较旧的Oracle版本:
select ship_date,
sum(decode(category, 'A', shp1)) shp1_a,
sum(decode(category, 'N', shp1)) shp1_n,
sum(decode(category, 'A', sxm1)) sxm1_a,
sum(decode(category, 'N', sxm1)) sxm1_n,
sum(decode(category, 'A', shp1)) + sum(decode(category, 'A', sxm1)) total_a,
sum(decode(category, 'N', shp1)) + sum(decode(category, 'N', sxm1)) total_n
from (
SELECT A.ship_date,
CASE WHEN (A.tracking_id) LIKE 'Q%' THEN 'A' ELSE 'N' END Category,
COUNT(seen_at_SHP1_sort_scan) shp1, COUNT(seen_at_SXM1_sort_scan) sxm1
from (
select o.carrier_ref_number tracking_id, o.pkg_manifest_run_date ship_date,
(SELECT min(transport_shipment_status_date) FROM transport_shipments ts JOIN transport_shipment_statuses tss ON tss.transport_shipment_id=ts.transport_shipment_id WHERE ts.carrier_ref_number=o.carrier_ref_number AND tss.ship_status='X4' AND tss.status_node_id='SHP1') seen_at_SHP1_sort_scan,
(SELECT min(transport_shipment_status_date) FROM transport_shipments ts JOIN transport_shipment_statuses tss ON tss.transport_shipment_id=ts.transport_shipment_id WHERE ts.carrier_ref_number=o.carrier_ref_number AND tss.ship_status='X4' AND tss.status_node_id='SXM1') seen_at_SXM1_sort_scan
FROM otm_ob_cust_pkg_records o
WHERE o.pkg_manifest_run_date BETWEEN to_date('20150312', 'YYYYMMDD') - 10 AND to_date('20150312', 'YYYYMMDD')
) A
WHERE A.seen_at_SHP1_sort_scan IS NOT NULL OR A.seen_at_SXM1_sort_scan IS NOT NULL
GROUP BY A.ship_date, a.tracking_id)
group by ship_date order by ship_date
您可能希望使用nvl…,0对列求和,例如:nvlsumdecodecategory,'A',shp1,0 shp1_A
两个查询的测试结果:
SHIP_DATE SHP1_A SHP1_N SXM1_A SXM1_N TOTAL_A TOTAL_N
---------- ------- ------- ------- ------- ------- -------
2015-03-11 0 1 0 1 0 2
2015-03-12 1 0 1 0 2 0
考虑使用SQLPivot函数 参考页中的示例:
select * from (
select times_purchased as "Puchase Frequency", state_code
from customers t
)
pivot
(
count(state_code)
for state_code in ('NY' as "New York",'CT' "Connecticut",'NJ' "New Jersey",'FL' "Florida",'MO' as "Missouri")
)
结果的格式使它们更容易理解-您需要做更多的工作,因为我不确定哪些文本是列,哪些是某些列的数据,例如,除扫描日期以外的所有列。您使用的Oracle版本是什么?如果<11g,则需要使用条件聚合来透视。如果11g或更高,您最好使用PIVOT功能。我正在使用Hi,感谢上面的内容。我刚刚用您能建议的格式编辑了我的查询。我会尝试,请检查一段时间。我成功地做到了。希望它对你有用。请参阅编辑部分。由于某些原因,上面的部分仍然给我提供了近1400行数据。数据日期不止一次出现,结果并没有像上面的示例中所示的那样出现,所以我们应该用sum更改计数吗?我怀疑跟踪_id缺少分组,请尝试上一次查询。改成总和是行不通的。您所指的结果并不像您在上面的示例中所示的那样出现?您没有附加任何输入数据,因此我放置了一些测试值。另外-我不计算:在扫描时看到,因为在原始查询中,您不想要它。而是第一列的总和。改变它很简单,但不清楚应该做什么。
SHIP_DATE SHP1_A SHP1_N SXM1_A SXM1_N TOTAL_A TOTAL_N
---------- ------- ------- ------- ------- ------- -------
2015-03-11 0 1 0 1 0 2
2015-03-12 1 0 1 0 2 0
select * from (
select times_purchased as "Puchase Frequency", state_code
from customers t
)
pivot
(
count(state_code)
for state_code in ('NY' as "New York",'CT' "Connecticut",'NJ' "New Jersey",'FL' "Florida",'MO' as "Missouri")
)