【发布时间】:2011-10-14 13:25:04
【问题描述】:
我在这个网站上搜索了几个建议,但还没有完全得到我想要的。我怀疑只是缺少一个语法/标点符号问题。
我使用 phpPgAdmin 在数据库上工作,该数据库跟踪与正在研究的狒狒种群相关的大量信息。我正在尝试进行查询以识别,对于每只狒狒,我们为它们收集了多少不同类型的组织样本,以及我们为每个狒狒收集了多少不同类型的 DNA 样本。有三个表与我的问题:
表:“传记”包含关于该组中所有动物的基本信息,尽管我只关心名称。
name | birth
-----+-----------
A21 | 1968-07-01
AAR | 2002-03-30
ABB | 1998-09-10
ABD | 2005-03-15
ABE | 1986-01-01
表:“babtissue”跟踪关于多年来收集的不同组织的信息,包括以下三列。此表中的某些行代表我们不再拥有的组织样本,但仍会在数据库的其他地方引用,因此“可用”列帮助我们筛选我们仍然拥有的样本。
name | sample_type | avail
-----+-------------+------
A21 | BLOOD | Y
A21 | BLOOD | Y
A21 | TISSUE | N
ABB | BLOOD | Y
ABB | TISSUE | Y
表:“dna”类似于 babtissue。
name | sample_type | avail
-----+-------------+------
ABB | GDNA | N
ABB | WGA | Y
ACC | WGA | N
ALE | GDNA | Y
ALE | GDNA | Y
总而言之,我正在尝试编写一个查询,该查询将返回传记中的每个名字,并在一列中告诉我每个人有多少“BLOOD”、“TISSUE”、“GDNA”和“WGA”样本.有点像...
name | bloodsamps | tissuesamps | gdnas | wgas | avail
-----+------------+-------------+-------+------+------
A21 | 2 | 0 | 0 | 0 | ?
AAR | 0 | 0 | 0 | 0 | ?
ABB | 1 | 1 | 0 | 1 | ?
ACC | 0 | 0 | 0 | 0 | ?
ALE | 0 | 0 | 2 | 0 | ?
(对上面奇怪的格式表示歉意,我不太熟悉这种方式)
我尝试过的查询的最新版本:
select b.name,
sum(case when t.sample_type='BLOOD' and t.avail='Y' then 1 else 0 end) as bloodsamps,
sum(case when t.sample_type='TISSUE' and t.avail='Y' then 1 else 0 end) as tissuesamps,
sum(case when d.sample_type='GDNA' and d.avail='Y' then 1 else 0 end) as gdnas,
sum(case when d.sample_type='WGA' and d.avail='Y' then 1 else 0 end) as wgas
from biograph b
left join babtissue t on b.name=t.name
left join dna d on b.name=d.name
where b.name is not NULL
group by b.name
order by b.name
这样做时我没有收到任何错误,但我知道它给我的数字是错误的——太高了。我认为这与我使用多个连接有关,并且我的连接语法需要更改。
有什么想法吗?
【问题讨论】:
-
我整理了你的格式,但我不确定你在
avail列中想要什么,所以我把?留在那里。 -
谢谢,@mu 太短了。
标签: sql postgresql join count sum