Oracle PIVOT是一个select语句

时间:2013-09-18 06:55:09

标签: oracle oracle11g oracle-sqldeveloper

我想调整一个select语句。 列“国家”,“商店”和“销售”给出。

现在我希望输出如下:

         Store1  Store2 Store3
Country1   2342    2342   5675
Country2   5753    3274   7326
Country3   1543    4367   3367

所以基本上我需要每个商店的salescount,每个国家。

输入来自(示例):

Country:    StoreNr:    ProductSold:
 Belgium         23             Car
 Belgium         23           House
Netherland       23             Car

输出将是:

             Store23
Belgium            2
Netherlands        1

1 个答案:

答案 0 :(得分:2)

如果商店数量有限,您可以使用以下方法之一:

  1. 使用count()聚合函数与case表达式结合使用:

    -- sample of data. just for the sake of demonstration
    SQL> with t1(Country, StoreNr, ProductSold) as(
      2    select 'Belgium'   , 23,  'Car'   from dual union all
      3    select 'Belgium'   , 23,  'House' from dual union all
      4    select 'Netherland', 23,  'Car'   from dual union all
      5    select 'Belgium'   , 25,  'House' from dual
      6  )
      7  select country
      8       , count(case
      9                 when StoreNr = 23
     10                 then 1
     11               end) as storeNr_23
     12        , count(case
     13                 when StoreNr = 25
     14                 then 1
     15               end) as storeNr_25
     16    from t1
     17   group by country
     18  ;
    

    结果:

     COUNTRY    STORENR_23 STORENR_25
     ---------- ---------- ----------
     Belgium             2          1
     Netherland          1          0
    
  2. 从Oracle 11g及更高版本开始,pivot运算符如下:

    select *
      from (Select country as country
                 , country as country_cnt
                 , StoreNr
             from t1)
     pivot(                                 -- list all store numbers here
         count(country_cnt) for storenr in (  23 as StoreNr_23
                                            , 25 as StoreNr_25) 
     )                                       
    

    结果:

     COUNTRY    STORENR_23 STORENR_25
     ---------- ---------- ----------
     Belgium             2          1
     Netherland          1          0