Machindra
Machindra

Reputation: 67

Oracle Pivot query

I have data in table in below format.

Date           Country  City         Sales
----------------------------------------------
01/01/2019  USA Alabama       1
01/01/2019  USA Alaska        2
01/01/2019  USA Kansas        3
01/01/2019  USA  Maryland     4
01/01/2019  UK  London        5
01/01/2019  UK  Edinburgh     6
02/01/2019  USA Alabama       7
02/01/2019  USA Alaska        8
02/01/2019  USA Kansas        9
02/01/2019  USA  Maryland     10
02/01/2019  UK  London        11
02/01/2019  UK  Edinburgh     12
03/01/2019  USA Alabama       13
03/01/2019  USA Alaska        14
03/01/2019  USA Kansas        15
03/01/2019  USA Maryland     16
03/01/2019  UK  London        17
03/01/2019  UK  Edinburgh     18

I would like get the output of as below

            USA     USA     USA     USA        UK        UK
Date        Alabama Alaska  Kansas  Maryland   London   Edinburgh
-----------------------------------------------------------------------
01/01/2019  1       2       3       4          5        6
02/01/2019  7       8       9       10         11       12
03/01/2019  13      14      15      16         17       18

Upvotes: 0

Views: 44

Answers (2)

MT0
MT0

Reputation: 167982

Use a PIVOT on the combination of country and city:

Oracle Setup:

CREATE TABLE table_name ( DT, Country, City, Sales ) AS
  SELECT DATE '2019-01-01', 'USA', 'Alabama',    1 FROM DUAL UNION ALL
  SELECT DATE '2019-01-01', 'USA', 'Alaska',     2 FROM DUAL UNION ALL
  SELECT DATE '2019-01-01', 'USA', 'Kansas',     3 FROM DUAL UNION ALL
  SELECT DATE '2019-01-01', 'USA', 'Maryland',   4 FROM DUAL UNION ALL
  SELECT DATE '2019-01-01', 'UK',  'London',     5 FROM DUAL UNION ALL
  SELECT DATE '2019-01-01', 'UK',  'Edinburgh',  6 FROM DUAL UNION ALL
  SELECT DATE '2019-01-02', 'USA', 'Alabama',    7 FROM DUAL UNION ALL
  SELECT DATE '2019-01-02', 'USA', 'Alaska',     8 FROM DUAL UNION ALL
  SELECT DATE '2019-01-02', 'USA', 'Kansas',     9 FROM DUAL UNION ALL
  SELECT DATE '2019-01-02', 'USA', 'Maryland',  10 FROM DUAL UNION ALL
  SELECT DATE '2019-01-02', 'UK',  'London',    11 FROM DUAL UNION ALL
  SELECT DATE '2019-01-02', 'UK',  'Edinburgh', 12 FROM DUAL UNION ALL
  SELECT DATE '2019-01-03', 'USA', 'Alabama',   13 FROM DUAL UNION ALL
  SELECT DATE '2019-01-03', 'USA', 'Alaska',    14 FROM DUAL UNION ALL
  SELECT DATE '2019-01-03', 'USA', 'Kansas',    15 FROM DUAL UNION ALL
  SELECT DATE '2019-01-03', 'USA', 'Maryland',  16 FROM DUAL UNION ALL
  SELECT DATE '2019-01-03', 'UK',  'London',    17 FROM DUAL UNION ALL
  SELECT DATE '2019-01-03', 'UK',  'Edinburgh', 18 FROM DUAL;

Query:

SELECT *
FROM   table_name
PIVOT  ( SUM( sales ) FOR ( Country, City ) IN (
  ( 'USA', 'Alabama'   ) AS USA_Alabama,
  ( 'USA', 'Alaska'    ) AS USA_Alaska,
  ( 'USA', 'Kansas'    ) AS USA_Kansas,
  ( 'USA', 'Maryland'  ) AS USA_Maryland,
  ( 'UK',  'London'    ) AS UK_London,
  ( 'UK',  'Edinburgh' ) AS UK_Edinburgh
) )
ORDER BY dt

Output:

DT        | USA_ALABAMA | USA_ALASKA | USA_KANSAS | USA_MARYLAND | UK_LONDON | UK_EDINBURGH
:-------- | ----------: | ---------: | ---------: | -----------: | --------: | -----------:
01-JAN-19 |           1 |          2 |          3 |            4 |         5 |            6
02-JAN-19 |           7 |          8 |          9 |           10 |        11 |           12
03-JAN-19 |          13 |         14 |         15 |           16 |        17 |           18

db<>fiddle here

Upvotes: 1

Ankit Bajpai
Ankit Bajpai

Reputation: 13509

You can try below query -

SELECT *
FROM (SELECT Date, Country || ' ' || City, Sales
      FROM YOUR_TABLE) X
PIVOT(
      SALES FOR Country || ' ' || City IN
          ('USA Alabama', 'USA Alaska', 'USA Kansas',
           'USA  Maryland', 'UK  London', 'UK  Edinburgh')
     )

Upvotes: 0

Related Questions