Files
email-tracker/external/duckdb/test/sql/pivot/pivot_expressions.test
2025-10-24 19:21:19 -05:00

112 lines
2.7 KiB
SQL

# name: test/sql/pivot/pivot_expressions.test
# description: Test SQL pivot expressions
# group: [pivot]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE Cities(Country VARCHAR, Name VARCHAR, Year INT, Population INT);
statement ok
INSERT INTO Cities VALUES ('NL', 'Amsterdam', 2000, 1005);
statement ok
INSERT INTO Cities VALUES ('NL', 'Amsterdam', 2010, 1065);
statement ok
INSERT INTO Cities VALUES ('NL', 'Amsterdam', 2020, 1158);
statement ok
INSERT INTO Cities VALUES ('US', 'Seattle', 2000, 564);
statement ok
INSERT INTO Cities VALUES ('US', 'Seattle', 2010, 608);
statement ok
INSERT INTO Cities VALUES ('US', 'Seattle', 2020, 738);
statement ok
INSERT INTO Cities VALUES ('US', 'New York City', 2000, 8015);
statement ok
INSERT INTO Cities VALUES ('US', 'New York City', 2010, 8175);
statement ok
INSERT INTO Cities VALUES ('US', 'New York City', 2020, 8772);
query IIII rowsort
PIVOT Cities ON Country || '_' || Name USING SUM(Population) GROUP BY Year;
----
2000 1005 8015 564
2010 1065 8175 608
2020 1158 8772 738
query II rowsort
PIVOT Cities ON (CASE WHEN Country='NL' THEN NULL ELSE Country END) USING SUM(Population) GROUP BY Year;
----
2000 8579
2010 8783
2020 9510
# we allow expressions in the aggregate as well
query IIII rowsort
PIVOT Cities ON Country || '_' || Name USING COALESCE(SUM(Population), 0) GROUP BY Year;
----
2000 1005 8015 564
2010 1065 8175 608
2020 1158 8772 738
# casts
query IIII rowsort
PIVOT Cities ON Country || '_' || Name USING SUM(Population)::VARCHAR GROUP BY Year;
----
2000 1005 8015 564
2010 1065 8175 608
2020 1158 8772 738
# functions
query IIII rowsort
PIVOT Cities ON Country || '_' || Name USING SUM(Population) + 42 GROUP BY Year;
----
2000 1047 8057 606
2010 1107 8217 650
2020 1200 8814 780
# we cannot have multiple aggregates
statement error
PIVOT Cities ON Country || '_' || Name USING SUM(Population) + COUNT(*) GROUP BY Year;
----
Pivot expression must contain exactly one aggregate
# columns can only be referenced within the aggregate
statement error
PIVOT Cities ON Country || '_' || Name USING SUM(Population) + Population GROUP BY Year;
----
Columns can only be referenced within the aggregate of a PIVOT expression
statement error
PIVOT Cities ON min(Country) over () USING SUM(Population) GROUP BY Year;
----
cannot contain window functions
statement error
PIVOT Cities ON min(Country) USING SUM(Population) GROUP BY Year;
----
cannot contain aggregates
statement error
PIVOT Cities ON NULL USING SUM(Population) GROUP BY Year;
----
Cannot pivot on constant value
statement error
PIVOT Cities ON 'hello world' USING SUM(Population) GROUP BY Year;
----
Cannot pivot on constant value
statement error
PIVOT Cities ON (SELECT COUNTRY) USING SUM(Population) GROUP BY Year;
----
Cannot pivot on subquery