-- Migrated from DuckDB test: test/sql/join/cross_product/ advanced tests
-- Tests advanced cross join scenarios
CREATE TABLE products(prod_id INTEGER, prod_name VARCHAR, price DOUBLE, ts TIMESTAMP TIME INDEX);

Affected Rows: 0

CREATE TABLE stores(store_id INTEGER, store_name VARCHAR, city VARCHAR, ts TIMESTAMP TIME INDEX);

Affected Rows: 0

CREATE TABLE categories(cat_id INTEGER, cat_name VARCHAR, ts TIMESTAMP TIME INDEX);

Affected Rows: 0

INSERT INTO products VALUES
(1, 'Laptop', 999.99, 1000), (2, 'Mouse', 29.99, 2000), (3, 'Monitor', 299.99, 3000);

Affected Rows: 3

INSERT INTO stores VALUES
(1, 'TechStore', 'NYC', 1000), (2, 'GadgetShop', 'LA', 2000);

Affected Rows: 2

INSERT INTO categories VALUES
(1, 'Electronics', 1000), (2, 'Accessories', 2000);

Affected Rows: 2

-- Basic cross join
SELECT
  p.prod_name, s.store_name, s.city
FROM products p
CROSS JOIN stores s
ORDER BY p.prod_id, s.store_id;

+-----------+------------+------+
| prod_name | store_name | city |
+-----------+------------+------+
| Laptop    | TechStore  | NYC  |
| Laptop    | GadgetShop | LA   |
| Mouse     | TechStore  | NYC  |
| Mouse     | GadgetShop | LA   |
| Monitor   | TechStore  | NYC  |
| Monitor   | GadgetShop | LA   |
+-----------+------------+------+

-- Cross join with filtering
SELECT
  p.prod_name, s.store_name, p.price
FROM products p
CROSS JOIN stores s
WHERE p.price > 100.00
ORDER BY p.price DESC, s.store_name;

+-----------+------------+--------+
| prod_name | store_name | price  |
+-----------+------------+--------+
| Laptop    | GadgetShop | 999.99 |
| Laptop    | TechStore  | 999.99 |
| Monitor   | GadgetShop | 299.99 |
| Monitor   | TechStore  | 299.99 |
+-----------+------------+--------+

-- Triple cross join
SELECT
  p.prod_name, s.store_name, c.cat_name,
  CASE WHEN p.price > 500 THEN 'Premium' ELSE 'Standard' END as tier
FROM products p
CROSS JOIN stores s
CROSS JOIN categories c
ORDER BY p.prod_id, s.store_id, c.cat_id;

+-----------+------------+-------------+----------+
| prod_name | store_name | cat_name    | tier     |
+-----------+------------+-------------+----------+
| Laptop    | TechStore  | Electronics | Premium  |
| Laptop    | TechStore  | Accessories | Premium  |
| Laptop    | GadgetShop | Electronics | Premium  |
| Laptop    | GadgetShop | Accessories | Premium  |
| Mouse     | TechStore  | Electronics | Standard |
| Mouse     | TechStore  | Accessories | Standard |
| Mouse     | GadgetShop | Electronics | Standard |
| Mouse     | GadgetShop | Accessories | Standard |
| Monitor   | TechStore  | Electronics | Standard |
| Monitor   | TechStore  | Accessories | Standard |
| Monitor   | GadgetShop | Electronics | Standard |
| Monitor   | GadgetShop | Accessories | Standard |
+-----------+------------+-------------+----------+

-- Cross join with aggregation
SELECT
  s.city,
  COUNT(*) as product_store_combinations,
  AVG(p.price) as avg_price,
  SUM(p.price) as total_inventory_value
FROM products p
CROSS JOIN stores s
GROUP BY s.city
ORDER BY s.city;

+------+----------------------------+-------------------+-----------------------+
| city | product_store_combinations | avg_price         | total_inventory_value |
+------+----------------------------+-------------------+-----------------------+
| LA   | 3                          | 443.3233333333333 | 1329.97               |
| NYC  | 3                          | 443.3233333333333 | 1329.97               |
+------+----------------------------+-------------------+-----------------------+

-- Cross join for inventory matrix
SELECT
  p.prod_name,
  SUM(CASE WHEN s.city = 'NYC' THEN 1 ELSE 0 END) as nyc_availability,
  SUM(CASE WHEN s.city = 'LA' THEN 1 ELSE 0 END) as la_availability,
  COUNT(s.store_id) as total_store_availability
FROM products p
CROSS JOIN stores s
GROUP BY p.prod_name, p.prod_id
ORDER BY p.prod_id;

+-----------+------------------+-----------------+--------------------------+
| prod_name | nyc_availability | la_availability | total_store_availability |
+-----------+------------------+-----------------+--------------------------+
| Laptop    | 1                | 1               | 2                        |
| Mouse     | 1                | 1               | 2                        |
| Monitor   | 1                | 1               | 2                        |
+-----------+------------------+-----------------+--------------------------+

-- Cross join with conditions and calculations
SELECT
  p.prod_name,
  s.store_name,
  p.price,
  p.price * 0.1 as store_commission,
  p.price * 1.08 as price_with_tax
FROM products p
CROSS JOIN stores s
WHERE p.price BETWEEN 25.00 AND 1000.00
ORDER BY p.price DESC, s.store_name;

+-----------+------------+--------+--------------------+--------------------+
| prod_name | store_name | price  | store_commission   | price_with_tax     |
+-----------+------------+--------+--------------------+--------------------+
| Laptop    | GadgetShop | 999.99 | 99.99900000000001  | 1079.9892          |
| Laptop    | TechStore  | 999.99 | 99.99900000000001  | 1079.9892          |
| Monitor   | GadgetShop | 299.99 | 29.999000000000002 | 323.98920000000004 |
| Monitor   | TechStore  | 299.99 | 29.999000000000002 | 323.98920000000004 |
| Mouse     | GadgetShop | 29.99  | 2.999              | 32.3892            |
| Mouse     | TechStore  | 29.99  | 2.999              | 32.3892            |
+-----------+------------+--------+--------------------+--------------------+

DROP TABLE products;

Affected Rows: 0

DROP TABLE stores;

Affected Rows: 0

DROP TABLE categories;

Affected Rows: 0

