Sql 如何使用不同的条件查询同一列
我有两张表,分别是sugar_distribution和farmer_dir 糖分配表包含季节、农民id和供应的吨数。 farmer_dir包含farmer_名称和farmer_id。我需要的是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
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;那只是我答案的副本;-。至少有点