0

これが私のデータセットです(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}

コードを編集して、「ベーコン」の:amountと「卵(ダース)」の:amountが含まれるようにします。たとえば、次のようになります。

{:items=>"Bacon + Eggs (dozen)", :year=>1890, :amount=>0.328, :eggs_price=>0.208, :bacon_price=>0.12}

どうすればよいですか?

4

1 に答える 1

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

より柔軟性が必要な場合(フィルタリングして表示するために3つ以上の項目)、動的SQLクエリの使用を検討します。

于 2012-09-29T19:49:40.190 に答える