|
@@ -0,0 +1,142 @@
|
|
|
|
|
+SET ":ago" = COALESCE(:ago, '90 days');
|
|
|
|
|
+--SELECT 'form' AS component;
|
|
|
|
|
+--SELECT 'ago' AS name
|
|
|
|
|
+--, 'Period' AS label
|
|
|
|
|
+--, 'input' AS type
|
|
|
|
|
+--, :ago AS value
|
|
|
|
|
+--;
|
|
|
|
|
+--SELECT 'dynamic' AS component, sqlpage.run_sql('sqlpage/internal/cookie.sql') AS properties;
|
|
|
|
|
+--SET products = sqlpage.cookie('products')::json;
|
|
|
|
|
+--SET categories = sqlpage.cookie('categories')::json;
|
|
|
|
|
+--SET groups = sqlpage.cookie('groups')::json;
|
|
|
|
|
+--SET tags = sqlpage.cookie('tags')::json;
|
|
|
|
|
+--SET start = sqlpage.cookie('start');
|
|
|
|
|
+--SET end = sqlpage.cookie('end');
|
|
|
|
|
+--SET unit_volume = sqlpage.cookie('unit_volume');
|
|
|
|
|
+--SET unit_mass = sqlpage.cookie('unit_mass');
|
|
|
|
|
+--SET unit_count = sqlpage.cookie('unit_count')::json;
|
|
|
|
|
+--SET log_scale = sqlpage.cookie('log_scale');
|
|
|
|
|
+SELECT 'table' AS component
|
|
|
|
|
+, TRUE AS search
|
|
|
|
|
+, TRUE AS striped_rows
|
|
|
|
|
+, TRUE AS small
|
|
|
|
|
+;
|
|
|
|
|
+WITH mass(
|
|
|
|
|
+ "group",
|
|
|
|
|
+ name,
|
|
|
|
|
+ organic,
|
|
|
|
|
+ price,
|
|
|
|
|
+ oz,
|
|
|
|
|
+ lb
|
|
|
|
|
+) AS (
|
|
|
|
|
+ SELECT g.name
|
|
|
|
|
+ , p.name
|
|
|
|
|
+ , t.organic
|
|
|
|
|
+ , t.price
|
|
|
|
|
+ , t.quantity*convert_unit(u.name, 'oz', p.name) oz
|
|
|
|
|
+ , t.quantity*convert_unit(u.name, 'lb', p.name) lb
|
|
|
|
|
+ FROM transactions t, products p, units u, unit_types ut, categories c, groups g
|
|
|
|
|
+ WHERE t.unit_id = u.id AND u.unit_type_id = ut.id AND t.product_id = p.id AND c.id = category_id AND g.id = group_id
|
|
|
|
|
+ AND ut.name = 'Mass' --AND ts > CURRENT_TIMESTAMP - :ago::interval
|
|
|
|
|
+ AND
|
|
|
|
|
+ (p.name IN (SELECT v#>>'{}' FROM json_array_elements($products::json) j(v)) OR $products IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ (c.name IN (SELECT v#>>'{}' FROM json_array_elements($categories::json) j(v)) OR $categories IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ (g.name IN (SELECT v#>>'{}' FROM json_array_elements($groups::json) j(v)) OR $groups IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ --((ts AT TIME ZONE 'UTC') AT TIME ZONE 'Pacific/Auckland')::date
|
|
|
|
|
+ ((ts AT TIME ZONE 'UTC') AT TIME ZONE 'US/Eastern')::date
|
|
|
|
|
+ BETWEEN $start::date AND $end::date
|
|
|
|
|
+), vol(
|
|
|
|
|
+ "group",
|
|
|
|
|
+ name,
|
|
|
|
|
+ organic,
|
|
|
|
|
+ price,
|
|
|
|
|
+ floz,
|
|
|
|
|
+ gal
|
|
|
|
|
+) AS (
|
|
|
|
|
+ SELECT g.name
|
|
|
|
|
+ , p.name
|
|
|
|
|
+ , t.organic
|
|
|
|
|
+ , t.price
|
|
|
|
|
+ , t.quantity*convert_unit(u.name, 'fl. oz.', p.name) floz
|
|
|
|
|
+ , t.quantity*convert_unit(u.name, 'gal', p.name) gal
|
|
|
|
|
+ FROM transactions t, products p, units u, unit_types ut, categories c, groups g
|
|
|
|
|
+ WHERE t.unit_id = u.id AND u.unit_type_id = ut.id AND t.product_id = p.id AND c.id = category_id AND g.id = group_id
|
|
|
|
|
+ AND ut.name = 'Volume' --AND ts > CURRENT_TIMESTAMP - :ago::interval
|
|
|
|
|
+ AND
|
|
|
|
|
+ (p.name IN (SELECT v#>>'{}' FROM json_array_elements($products::json) j(v)) OR $products IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ (c.name IN (SELECT v#>>'{}' FROM json_array_elements($categories::json) j(v)) OR $categories IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ (g.name IN (SELECT v#>>'{}' FROM json_array_elements($groups::json) j(v)) OR $groups IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ --((ts AT TIME ZONE 'UTC') AT TIME ZONE 'Pacific/Auckland')::date
|
|
|
|
|
+ ((ts AT TIME ZONE 'UTC') AT TIME ZONE 'US/Eastern')::date
|
|
|
|
|
+ BETWEEN $start::date AND $end::date
|
|
|
|
|
+), piece(
|
|
|
|
|
+ "group",
|
|
|
|
|
+ name,
|
|
|
|
|
+ organic,
|
|
|
|
|
+ price,
|
|
|
|
|
+ pieces,
|
|
|
|
|
+ ksheets
|
|
|
|
|
+) AS (
|
|
|
|
|
+ SELECT g.name
|
|
|
|
|
+ , p.name
|
|
|
|
|
+ , t.organic
|
|
|
|
|
+ , t.price
|
|
|
|
|
+ , t.quantity*convert_unit(u.name, 'Pieces', p.name) pieces
|
|
|
|
|
+ , t.quantity*convert_unit(u.name, 'kSheets', p.name) ksheets
|
|
|
|
|
+ FROM transactions t, products p, units u, unit_types ut, categories c, groups g
|
|
|
|
|
+ WHERE t.unit_id = u.id AND u.unit_type_id = ut.id AND t.product_id = p.id AND c.id = category_id AND g.id = group_id
|
|
|
|
|
+ AND ut.name = 'Count' --AND ts > CURRENT_TIMESTAMP - :ago::interval
|
|
|
|
|
+ AND
|
|
|
|
|
+ (p.name IN (SELECT v#>>'{}' FROM json_array_elements($products::json) j(v)) OR $products IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ (c.name IN (SELECT v#>>'{}' FROM json_array_elements($categories::json) j(v)) OR $categories IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ (g.name IN (SELECT v#>>'{}' FROM json_array_elements($groups::json) j(v)) OR $groups IS NULL)
|
|
|
|
|
+ AND
|
|
|
|
|
+ --((ts AT TIME ZONE 'UTC') AT TIME ZONE 'Pacific/Auckland')::date
|
|
|
|
|
+ ((ts AT TIME ZONE 'UTC') AT TIME ZONE 'US/Eastern')::date
|
|
|
|
|
+ BETWEEN $start::date AND $end::date
|
|
|
|
|
+)
|
|
|
|
|
+SELECT "group", name, organic org, 'oz' "by", round(min(price/oz), 2) min, round(sum(price)/sum(oz), 2) avg, round(max(price/oz), 2) max
|
|
|
|
|
+FROM mass
|
|
|
|
|
+GROUP BY "group", name, organic
|
|
|
|
|
+UNION
|
|
|
|
|
+SELECT "group", name, organic org, 'lb' "by", round(min(price/lb), 2) min, round(sum(price)/sum(lb), 2) avg, round(max(price/lb), 2) max
|
|
|
|
|
+FROM mass
|
|
|
|
|
+GROUP BY "group", name, organic
|
|
|
|
|
+--ORDER BY "group", name, "by";
|
|
|
|
|
+--;
|
|
|
|
|
+--
|
|
|
|
|
+--SELECT 'table' AS component
|
|
|
|
|
+--, TRUE AS search
|
|
|
|
|
+--;
|
|
|
|
|
+UNION
|
|
|
|
|
+SELECT "group", name, organic org, 'fl. oz.' "by", round(min(price/floz), 2) min, round(sum(price)/sum(floz), 2) avg, round(max(price/floz), 2) max
|
|
|
|
|
+FROM vol
|
|
|
|
|
+GROUP BY "group", name, organic
|
|
|
|
|
+UNION
|
|
|
|
|
+SELECT "group", name, organic org, 'gal' "by", round(min(price/gal), 2) min, round(sum(price)/sum(gal), 2) avg, round(max(price/gal), 2) max
|
|
|
|
|
+FROM vol
|
|
|
|
|
+GROUP BY "group", name, organic
|
|
|
|
|
+--ORDER BY "group", name, "by"
|
|
|
|
|
+--;
|
|
|
|
|
+--
|
|
|
|
|
+--SELECT 'table' AS component
|
|
|
|
|
+--, TRUE AS search
|
|
|
|
|
+--;
|
|
|
|
|
+UNION
|
|
|
|
|
+SELECT "group", name, organic org, 'Pieces' "by", round(min(price/pieces), 2) min, round(sum(CASE WHEN pieces IS NOT NULL THEN price ELSE NULL END)/sum(pieces), 2) avg, round(max(price/pieces), 2) max
|
|
|
|
|
+FROM piece
|
|
|
|
|
+GROUP BY "group", name, organic
|
|
|
|
|
+UNION
|
|
|
|
|
+SELECT "group", name, organic org, 'kSheets' "by", round(min(price/ksheets), 2) min, round(sum(CASE WHEN ksheets IS NOT NULL THEN price ELSE NULL END)/sum(ksheets), 2) avg, round(max(price/ksheets), 2) max
|
|
|
|
|
+FROM piece
|
|
|
|
|
+GROUP BY "group", name, organic
|
|
|
|
|
+ORDER BY "group", name, org, "by"
|
|
|
|
|
+;
|