Sql 如何在Oracle中创建轴心

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... 需要 接下来,

如何将下面的查询转换为透视格式?我需要ship date作为行跟踪id作为值,shp,sxm作为列,我只是在查询末尾添加了格式。如果有人能让我知道如何将所有这些转换为pivot格式,我真的是个新手,所以我希望有人能将我的查询转换为pivot而不是任何引用。

首先,您似乎缺少完成FROM子句的最终结束别名。你有

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")
)