2012-09-29 2 views
0

내 데이터 세트는 (Ruby gem Sequel을 사용하고 있으므로 해시 형식으로); (필자는 루비 보석 속편을 사용하고 있기 때문에 해시에서)다른 열을 PostgreSQL의 같은 행에 넣으려면 어떻게해야합니까?

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} 

I

다음
{: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} 

내 코드입니다 : 해시 이름은 열 이름입니다 "Bacon"에 대한 금액과 "Eggs (dozen)"에 대한 금액을 포함하도록 코드를 편집하고 싶습니다. 예 :

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

어떻게해야합니까?

+0

"10 x Bacon + 20 x Eggs"와 같이 _items_ 출력 열에 각 항목의 개별 금액을 갖는 것을 의미합니까? – 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에서 초보자이지만 하위 쿼리를 수행하는 방법을 더 잘 이해하고 있으며 FROM의 하위 쿼리가 유용하다는 것을 알 수 있습니다. 두 가지 빠른 질문 : 2 행은 무엇을 의미합니까? 무엇을 포함 할 것인가를 결정할 때 무엇을 의미합니까? – user1626730

+1

@ user1626730 : 파생 테이블에 별칭을 줄 필요가 있습니다. 따라서 'as t1'과' 't (c1, c2, ...) '와 같이 말하면 컬럼의 이름도 지정합니다. 그렇게하지 않으면'item_category','year' 및 'avg_yr_value'를't1'의 컬럼 이름으로 사용합니다.'||'는 SQL의 표준 문자열 연결 연산자이므로'item_bacon || '+'|| item_eggs'는 "# {item_bacon} + # {item_eggs}"와 같습니다. 'Ruby에서. –

+0

멋지다, 고마워. – user1626730

관련 문제