SET search_path to "ch benchmarks";
--Q16
SELECT
    i_name,
    substr(i_data, 1, 3) AS brand,
    i_price,
    count(DISTINCT (mod((s_w_id * s_i_id),10000))) AS supplier_cnt
FROM
    stock,
    item
WHERE i_id = s_i_id
  AND i_data NOT LIKE 'zz%'
  AND (mod((s_w_id * s_i_id),10000) NOT IN
       (SELECT su_suppkey
        FROM supplier
        WHERE su_comment LIKE '%bad%'))
GROUP BY
    i_name,
    substr(i_data, 1, 3),
    i_price
ORDER BY supplier_cnt DESC;
  i_name  | brand | i_price | supplier_cnt
---------------------------------------------------------------------
 Keyboard | co    |   50.00 |            3
(1 row)

--Q17
SELECT
       sum(ol_amount) / 2.0 AS avg_yearly
FROM
    order_line,
    (SELECT
         i_id,
         avg(ol_quantity) AS a
     FROM
         item,
         order_line
     WHERE i_data LIKE '%b'
       AND ol_i_id = i_id
     GROUP BY i_id) t
WHERE ol_i_id = t.i_id;
     avg_yearly
---------------------------------------------------------------------
 27.5000000000000000
(1 row)

-- this filter was at the end causing the dataset to be empty. it should not have any
-- influence on how the query gets planned so I removed the clause
--AND ol_quantity < t.a;
-- Query 18
SELECT
    c_last,
    c_id o_id,
    o_entry_d,
    o_ol_cnt,
    sum(ol_amount)
FROM
    customer,
    oorder,
    order_line
WHERE c_id = o_c_id
  AND c_w_id = o_w_id
  AND c_d_id = o_d_id
  AND ol_w_id = o_w_id
  AND ol_d_id = o_d_id
  AND ol_o_id = o_id
GROUP BY
    o_id,
    o_w_id,
    o_d_id,
    c_id,
    c_last,
    o_entry_d,
    o_ol_cnt
HAVING sum(ol_amount) > 5 -- was 200, but thats too big for the dataset
ORDER BY
    sum(ol_amount) DESC,
    o_entry_d;
 c_last | o_id |        o_entry_d         | o_ol_cnt |  sum
---------------------------------------------------------------------
 John   |   10 | Fri Oct 17 00:00:00 2008 |        1 | 10.00
 John   |    9 | Fri Oct 17 00:00:00 2008 |        1 |  9.00
 John   |    8 | Fri Oct 17 00:00:00 2008 |        1 |  8.00
 John   |    7 | Fri Oct 17 00:00:00 2008 |        1 |  7.00
 John   |    6 | Fri Oct 17 00:00:00 2008 |        1 |  6.00
(5 rows)

-- Query 19
SELECT
    sum(ol_amount) AS revenue
FROM
    order_line,
     item
WHERE (     ol_i_id = i_id
        AND i_data LIKE '%a'
        AND ol_quantity >= 1
        AND ol_quantity <= 10
        AND i_price BETWEEN 1 AND 400000
        AND ol_w_id IN (1,2,3))
   OR (     ol_i_id = i_id
        AND i_data LIKE '%b'
        AND ol_quantity >= 1
        AND ol_quantity <= 10
        AND i_price BETWEEN 1 AND 400000
        AND ol_w_id IN (1,2,4))
   OR (     ol_i_id = i_id
        AND i_data LIKE '%c'
        AND ol_quantity >= 1
        AND ol_quantity <= 10
        AND i_price BETWEEN 1 AND 400000
        AND ol_w_id IN (1,5,3));
 revenue
---------------------------------------------------------------------
    7.00
(1 row)

select   su_name, su_address
from     supplier, nation
where    su_suppkey in
        (select  mod(s_i_id * s_w_id, 10000)
        from     stock, order_line
        where    s_i_id in
                (select i_id
                 from item)
             and ol_i_id=s_i_id
             and ol_delivery_d > '2010-05-23 12:00:00'
        group by s_i_id, s_w_id, s_quantity
        having   2*s_quantity > sum(ol_quantity))
     and su_nationkey = n_nationkey
     and n_name = 'GERMANY'
order by su_name;
 su_name | su_address
---------------------------------------------------------------------
(0 rows)

