2012-09-29 36 views
0

这里是我的数据集(以哈希形式,因为我使用的红宝石宝石续集);哈希名称的列名:如何将这些不同的列放入PostgreSQL的同一行?

{: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 

我的结果(哈希值,因为我使用了红宝石的宝石续集):

{: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

意思具有每个项目的个别量到_items_输出列,如“10×培根+ 20×蛋”? – ubik

+0

啊,对不起。我已经添加了一个我想要的例子。 – user1626730

回答

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查询。

+0

是的,这有效。我在SQL新手,但我更好地理解如何做子查询,我可以看到从子查询如何是非常有用的。两个简单的问题:第2行是什么意思?当你有类似于“t(something,something2,something3)”的东西时,这意味着什么?你选择包含哪些列? – user1626730

+1

@ user1626730:你需要给派生表一个别名,因此'as as t1'和'如果你说'as t(c1,c2,...)',那么你也在命名列,如果你没有这样做,那么你会得到'item_category','year'和'avg_yr_value'作为't1'列名。''||是SQL标准的字符串连接运算符所以'item_bacon || '+' || item_eggs'就像' “#{} item_bacon +#{} item_eggs” '在Ruby中。 –

+0

很酷,谢谢你。 – user1626730

相关问题