File: pivot_databricks.test

package info (click to toggle)
duckdb 1.5.1-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 299,196 kB
  • sloc: cpp: 865,414; ansic: 57,292; python: 18,871; sql: 12,663; lisp: 11,751; yacc: 7,412; lex: 1,682; sh: 747; makefile: 558
file content (170 lines) | stat: -rw-r--r-- 6,107 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# name: test/sql/pivot/pivot_databricks.test
# description: Tests from the databricks docs
# group: [pivot]

# https://docs.databricks.com/sql/language-manual/sql-ref-syntax-qry-select-pivot.html

statement ok
PRAGMA enable_verification

statement ok
CREATE TEMP VIEW sales(year, quarter, region, sales) AS
   VALUES (2018, 1, 'east', 100),
          (2018, 2, 'east',  20),
          (2018, 3, 'east',  40),
          (2018, 4, 'east',  40),
          (2019, 1, 'east', 120),
          (2019, 2, 'east', 110),
          (2019, 3, 'east',  80),
          (2019, 4, 'east',  60),
          (2018, 1, 'west', 105),
          (2018, 2, 'west',  25),
          (2018, 3, 'west',  45),
          (2018, 4, 'west',  45),
          (2019, 1, 'west', 125),
          (2019, 2, 'west', 115),
          (2019, 3, 'west',  85),
          (2019, 4, 'west',  65);

query IIIIII rowsort
SELECT year, region, q1, q2, q3, q4
  FROM sales
  PIVOT (sum(sales)
    FOR quarter
    IN (1 AS q1, 2 AS q2, 3 AS q3, 4 AS q4));
----
2018	east	100	20	40	40
2018	west	105	25	45	45
2019	east	120	110	80	60
2019	west	125	115	85	65

# multiple matches with aliases
query IIIIIIIII rowsort
SELECT year, q1_east, q1_west, q2_east, q2_west, q3_east, q3_west, q4_east, q4_west
    FROM sales
    PIVOT (sum(sales)
      FOR (quarter, region)
      IN ((1, 'east') AS q1_east, (1, 'west') AS q1_west, (2, 'east') AS q2_east, (2, 'west') AS q2_west,
          (3, 'east') AS q3_east, (3, 'west') AS q3_west, (4, 'east') AS q4_east, (4, 'west') AS q4_west));
----
2018	100	105	20	25	40	45	40	45
2019	120	125	110	115	80	85	60	65

# inconsistent amount of names
statement error
SELECT year, q1_east, q1_west, q2_east, q2_west, q3_east, q3_west, q4_east, q4_west
    FROM sales
    PIVOT (sum(sales)
      FOR (quarter, region, too_many_names)
      IN ((1, 'east') AS q1_east, (1, 'west') AS q1_west, (2, 'east') AS q2_east, (2, 'west') AS q2_west,
          (3, 'east') AS q3_east, (3, 'west') AS q3_west, (4, 'east') AS q4_east, (4, 'west') AS q4_west));
----
inconsistent amount of rows

# inconsistent amount of rows in the IN list
statement error
SELECT year, q1_east, q1_west, q2_east, q2_west, q3_east, q3_west, q4_east, q4_west
    FROM sales
    PIVOT (sum(sales)
      FOR (quarter, region)
      IN ((1, 'east', 'west') AS q1_east, (1, 'west') AS q1_west, (2, 'east') AS q2_east, (2, 'west') AS q2_west,
          (3, 'east') AS q3_east, (3, 'west') AS q3_west, (4, 'east') AS q4_east, (4, 'west') AS q4_west));
----
inconsistent amount of rows

# duplicate values in IN list
statement error
SELECT *
    FROM sales
    PIVOT (sum(sales)
      FOR (quarter, region)
      IN ((1, 'east') AS q1_east, (1, 'east') AS q1_east_2));
----
specified multiple times in the IN clause

query IIIII rowsort
SELECT year, q1, q2, q3, q4
  FROM (SELECT year, quarter, sales FROM sales) AS s
  PIVOT (sum(sales)
    FOR quarter
    IN (1 AS q1, 2 AS q2, 3 AS q3, 4 AS q4));
----
2018	205	45	85	85
2019	245	225	165	125

# multiple aggregations
query IIIIIIIII rowsort
SELECT year, q1_total, q1_avg, q2_total, q2_avg, q3_total, q3_avg, q4_total, q4_avg
    FROM (SELECT year, quarter, sales FROM sales) AS s
    PIVOT (sum(sales) AS total, avg(sales) AS avg
      FOR quarter
      IN (1 AS q1, 2 AS q2, 3 AS q3, 4 AS q4));
----
2018	205	102.5	45	22.5	85	42.5	85	42.5
2019	245	122.5	225	112.5	165	82.5	125	62.5

# multiple aggregations without aliases
query IIIIIIIII rowsort
SELECT *
    FROM (SELECT year, quarter, sales FROM sales) AS s
    PIVOT (sum(sales), avg(sales)
      FOR quarter
      IN (1 AS q1, 2 AS q2, 3 AS q3, 4 AS q4));
----
2018	205	102.5	45	22.5	85	42.5	85	42.5
2019	245	122.5	225	112.5	165	82.5	125	62.5

# unpivot
statement ok
CREATE OR REPLACE TEMPORARY VIEW sales(location, year, q1, q2, q3, q4) AS
  VALUES ('Toronto'      , 2020, 100 , 80 , 70, 150),
         ('San Francisco', 2020, NULL, 20 , 50,  60),
         ('Toronto'      , 2021, 110 , 90 , 80, 170),
         ('San Francisco', 2021, 70  , 120, 85, 105);

query IIII rowsort
SELECT *
    FROM sales UNPIVOT INCLUDE NULLS
    (sales FOR quarter IN (q1       AS "Jan-Mar",
                           q2       AS "Apr-Jun",
                           q3       AS "Jul-Sep",
                           q4 AS "Oct-Dec"));
----
San Francisco	2020	Apr-Jun	20
San Francisco	2020	Jan-Mar	NULL
San Francisco	2020	Jul-Sep	50
San Francisco	2020	Oct-Dec	60
San Francisco	2021	Apr-Jun	120
San Francisco	2021	Jan-Mar	70
San Francisco	2021	Jul-Sep	85
San Francisco	2021	Oct-Dec	105
Toronto	2020	Apr-Jun	80
Toronto	2020	Jan-Mar	100
Toronto	2020	Jul-Sep	70
Toronto	2020	Oct-Dec	150
Toronto	2021	Apr-Jun	90
Toronto	2021	Jan-Mar	110
Toronto	2021	Jul-Sep	80
Toronto	2021	Oct-Dec	170

statement ok
CREATE OR REPLACE TEMPORARY VIEW oncall
         (year, week, area      , name1   , email1              , phone1     , name2   , email2              , phone2) AS
  VALUES (2022, 1   , 'frontend', 'Freddy', 'fred@alwaysup.org' , 15551234567, 'Fanny' , 'fanny@lwaysup.org' , 15552345678),
         (2022, 1   , 'backend' , 'Boris' , 'boris@alwaysup.org', 15553456789, 'Boomer', 'boomer@lwaysup.org', 15554567890),
         (2022, 2   , 'frontend', 'Franky', 'frank@lwaysup.org' , 15555678901, 'Fin'   , 'fin@alwaysup.org'  , 15556789012),
         (2022, 2   , 'backend' , 'Bonny' , 'bonny@alwaysup.org', 15557890123, 'Bea'   , 'bea@alwaysup.org'  , 15558901234);

query IIIIIII rowsort
SELECT *
    FROM oncall UNPIVOT ((name, email, phone) FOR precedence IN ((name1, email1, phone1) AS primary,
                                                                 (name2, email2, phone2) AS secondary));
----
2022	1	backend	primary	Boris	boris@alwaysup.org	15553456789
2022	1	backend	secondary	Boomer	boomer@lwaysup.org	15554567890
2022	1	frontend	primary	Freddy	fred@alwaysup.org	15551234567
2022	1	frontend	secondary	Fanny	fanny@lwaysup.org	15552345678
2022	2	backend	primary	Bonny	bonny@alwaysup.org	15557890123
2022	2	backend	secondary	Bea	bea@alwaysup.org	15558901234
2022	2	frontend	primary	Franky	frank@lwaysup.org	15555678901
2022	2	frontend	secondary	Fin	fin@alwaysup.org	15556789012