繁体   English   中英

同时旋转数据时提取数据

[英]Pulling data while pivoting at the same time

   ID | Type     | Code
   1    Purchase   A1
   1    Return     B1
   1    Exchange   C1
   2    Purchase   D1
   2    Return     NULL
   2    Exchange   F1
   3    Purchase   G1
   3    Return     H1
   3    Exchange   I1
   4    Purchase   J1
   4    Exchange   K1

以上是样本数据。 我想返回的是:

ID | Type     | Code
 1    Purchase   A1
 1    Return     B1
 1    Exchange   C1
 3    Purchase   G1
 3    Return     H1
 3    Exchange   I1

因此,如果该字段在代码中为null或该ID的Purchase,Return和Exchange值均不存在,请完全忽略该ID。 但是,还有最后一步。 我希望然后以这种方式透视这些数据:

ID | Purchase | Return | Exchange
1    A1         B1       C1
3    G1         H1       I1

我昨天问了这个,没有枢轴部分,您可以在这里看到:

SQL查询仅在所有必要列都存在且不为NULL时返回数据

但是我忘了最后一部分。 我试图和excel一起玩,但是没有运气。 我试图制作一个临时表,但数据太大,无法做到这一点,所以我想知道是否可以全部在1个sql语句中完成?

我个人成功使用了此查询:

select t.*
from t
where 3 = (select count(distinct t2.type)
       from t t2
       where t2.id = t.id and
             t2.type in ('Purchase', 'Exchange', 'Return') and
             t2.Code is not null
      );

那么我们如何调整它以包括枢轴部分。 那可能吗?

很容易。 只需使用条件聚合:

select t.id,
       max(case when type = 'Purchase' then code end) as Purchase,
       max(case when type = 'Exchange' then code end) as Exchange,
       max(case when type = 'Return' then code end) as Return
from t
where 3 = (select count(distinct t2.type)
       from t t2
       where t2.id = t.id and
             t2.type in ('Purchase', 'Exchange', 'Return') and
             t2.Code is not null
      )
group by t.id;

这实际上是用简单来表达(在我看来) having没有子查询:

select t.id,
       max(case when type = 'Purchase' then code end) as Purchase,
       max(case when type = 'Exchange' then code end) as Exchange,
       max(case when type = 'Return' then code end) as Return
from t
group by t.id
having max(case when type = 'Purchase' then code end) is not null and
       max(case when type = 'Exchange' then code end) is not null and
       max(case when type = 'Return' then code end) is not null;

许多数据库将允许:

having Purchase is not null and Exchange is not null and Return is not null

但甲骨文不允许在使用表的别名having条款。

更新 -根据问题注释中的讨论,我先前的查询有一个错误的假设(我从我认为在问题的原始查询中看到的内容继承过来); 我消除了这个错误的假设。

select id
     , max(case when type='Purchase' then Code end) Purchase
     , max(case when type='Return' then Code end) Return
     , max(case when type='Exchange' then Code end) Exchange
  from t
 where code is not null
   and type in ('Purchase', 'Return', 'Exchange')
 group by id
having count(distinct type) = 3

我将再次指出(就像您在其他线程中所做的那样),分析函数将更快地完成工作-它们需要基表仅被读取一次,并且没有显式或隐式联接。

   with
         test_data ( id, type, code ) as (
           select 1, 'Purchase', 'A1' from dual union all
           select 1, 'Return'  , 'B1' from dual union all
           select 1, 'Exchange', 'C1' from dual union all
           select 2, 'Purchase', 'D1' from dual union all
           select 2, 'Return'  , null from dual union all
           select 2, 'Exchange', 'F1' from dual union all
           select 3, 'Purchase', 'G1' from dual union all
           select 3, 'Return'  , 'H1' from dual union all
           select 3, 'Exchange', 'I1' from dual union all
           select 4, 'Purchase', 'J1' from dual union all
           select 4, 'Exchange', 'K1' from dual
         )
    -- end of test data; actual solution (SQL query) begins below this line
select id, purchase, return, exchange
from   ( select id, type, code
         from   ( select id, type, code,
                    count( distinct case when type in ('Purchase', 'Return', 'Exchange')
                                         then type end                         
                         ) over (partition by id)             as ct_type,
                    count( case when code is null then 1 end
                         ) over (partition by id)             as ct_code
                  from   test_data
                )
         where  ct_type = 3 and ct_code = 0
       )
pivot  ( min(code) for type in ('Purchase' as purchase, 'Return'   as return, 
                                                        'Exchange' as exchange)
       )
;

输出:

 ID PURCHASE RETURN   EXCHANGE
--- -------- -------- --------
  1 A1       B1       C1
  3 G1       H1       I1

2 rows selected.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM