这是我的数据集(以Hash形式,因为我使用的是Ruby gem Sequel);哈希名称是列名:
{:item_category=>"Bacon", :year=>1890, :avg_yr_value=>0.12}
{:item_category=>"Eggs (dozen)", :year=>1890, :avg_yr_value=>0.208}
{:item_category=>"Bacon", :year=>1891, :avg_yr_value=>0.126}
{:item_category=>"Eggs (dozen)", :year=>1891, :avg_yr_value=>0.221}
{:item_category=>"Bacon", :year=>1892, :avg_yr_value=>0.129}
{:item_category=>"Eggs (dozen)", :year=>1892, :avg_yr_value=>0.221}
{:item_category=>"Bacon", :year=>1893, :avg_yr_value=>0.142}
{:item_category=>"Eggs (dozen)", :year=>1893, :avg_yr_value=>0.224}
{:item_category=>"Bacon", :year=>1894, :avg_yr_value=>0.185}
这是我的代码:
SELECT
string_agg(DISTINCT item_category, ' + ' ORDER BY item_category) AS items,
year,
sum(avg_yr_value) AS amount
FROM
earnings_and_prices
WHERE
item_category = 'Bacon' OR
item_category = 'Eggs (dozen)'
GROUP BY
year
HAVING
COUNT(DISTINCT item_category) = 2
ORDER BY
year
我的结果(因为我使用的是Ruby gem Sequel中的哈希):
{:items=>"Bacon + Eggs (dozen)", :year=>1890, :amount=>0.328}
{:items=>"Bacon + Eggs (dozen)", :year=>1891, :amount=>0.347}
{:items=>"Bacon + Eggs (dozen)", :year=>1892, :amount=>0.35}
{:items=>"Bacon + Eggs (dozen)", :year=>1893, :amount=>0.366}
我想编辑我的代码,因此它将包括:“培根”的金额和:“鸡蛋(打)”的金额,例如:
{:items=>"Bacon + Eggs (dozen)", :year=>1890, :amount=>0.328, :eggs_price=>0.208, :bacon_price=>0.12}
我该怎么做?
答案 0 :(得分:1)
对于该特定情况,此查询适合:
SELECT
item_bacon || ' + ' || item_eggs AS items,
year,
bacon_avg_value + eggs_avg_value AS amount,
bacon_avg_value AS bacon_price,
eggs_avg_value AS eggs_price
FROM (
SELECT t1.item, t2.item, t1.year, t1.avg_value, t2.avg_value
FROM (
SELECT item_category, year, avg_yr_value
FROM earnings_and_prices
WHERE item_category = 'Bacon'
) AS t1(item, year, avg_value)
JOIN (
SELECT item_category, year, avg_yr_value
FROM earnings_and_prices
WHERE item_category = 'Eggs (dozen)'
) AS t2(item, year, avg_value)
USING( year )
) AS t(item_bacon, item_eggs, year, bacon_avg_value, eggs_avg_value)
ORDER BY year
如果您需要更多灵活性(要过滤和显示两个以上的项目),我会考虑使用动态SQL查询。