Sql 如何使用不同的条件查询同一列

Sql 如何使用不同的条件查询同一列,sql,oracle,join,self-join,Sql,Oracle,Join,Self Join,我有两张表,分别是sugar_distribution和farmer_dir 糖分配表包含季节、农民id和供应的吨数。 farmer_dir包含farmer_名称和farmer_id。我需要的是 Farmer_id Farmer_name Tons@2006 Tons@2012 123 Ramesh G 145.215 548.125 321 Ravish 21

我有两张表,分别是sugar_distribution和farmer_dir

糖分配表包含季节、农民id和供应的吨数。 farmer_dir包含farmer_名称和farmer_id。我需要的是

Farmer_id       Farmer_name    Tons@2006         Tons@2012

123              Ramesh G       145.215           548.125
321              Ravish         214.123           783.215
季节cd是年份字段。我要分析2006年和2012年供应的缔约方。我尝试了下面的查询,但没有得到我想要的

SELECT DISTINCT farmer_id,

(SELECT sum(tons)
 FROM sugar_distribution
 WHERE      (farmer_id = A.farmer_id) 
    AND (season_cd = 2)) AS T2006,

(SELECT sum(tons)
 FROM sugar_distribution
 WHERE      (farmer_id = A.farmer_id) 
    AND (season_cd = 8)) AS T2012

FROM sugar_distribution A 
WHERE A.season_cd = 2 OR A.season_cd = 8 order by to_number(farmer_id)
试试这个:

        SELECT farmer_id, MAX(t2006), MAX(t2012)
        FROM
        (
        SELECT farmer_id, sum(case when season_cd = 2 then tons else 0 end) t2006, SUM(case when season_cd = 8 then tons else 0 end) t2012
         FROM sugar_distribution
         WHERE      (farmer_id = A.farmer_id) 
            AND season_cd in (2,8)
           group by farmer_id, season_cd
         ) t
你很接近

select a.farmer_id, a.farmer_name,
 (select sum(tons_supplied)
            from sugar_distribution b
            where b.farmer_id = a.farmer_id
            and b.season_cd = 2) as t2006,
 (select sum(tons_supplied)
            from sugar_distribution b
            where b.farmer_id = a.farmer_id
            and b.season_cd = 8) as t2012
from farmer_dir a;

示例fiddle

这是一个使用条件聚合的聚合查询:

SELECT fd.farmer_id, fd.farmer_name,
       sum(case when season_cd = 2 then tons else 0 end) as tons2006,
       sum(case when season_cd = 8 then tons else 0 end) as tons2012
from farmer_dir fd join
     sugar_distribution sd
     on fd.farmer_id = sd.farmer_id
group by fd.farmer_id, fd.farmer_name
having tons2006 > 0 and tons2012 > 0

最后的having条款只是确保农民拥有这两个年份的记录。

这是可行的,但不只是过滤2006年和2012年的数据。它正在检索表farmer\u dir中的所有数据。但我只需要符合2006年和2012年标准的数据选择a.farmer\u id,a.farmer\u name,选择Suttons\u从sugar\u distribution b供应,其中b.farmer\u id=a.farmer\u id和b.season\u cd=2作为t2006,选择sugar_配送b提供的sumtons_,其中b.farmer_id=a.farmer_id和b.season_cd=8,作为farmer_dir a提供的t2012;那只是我答案的副本;-。至少有点