sql通过另一个表值从表中选择计数

时间:2013-11-27 00:56:08

标签: sql-server c#-4.0

我是sql数据库的初学者 我想要一些帮助....我有两个表(families_table)和(children_table)通过family_id相关所以家庭表中的每个家庭都有许多儿童表... 我想从家庭表中选择一些家庭,并知道所有选定家庭的孩子数量。我试图通过

来做到这一点
select count (*) from dbo.Children where family_id in (select top 50 percent * from dbo.Families where economic_state = 'a' or economic_state = 'j')

4 个答案:

答案 0 :(得分:1)

您可以使用group bycount进行此类查询:

select f.family_id, count(*)
from dbo.Families f
inner join dbo.Children c ON c.family_id = f.family_id
where f.economic_state = 'a' or f.economic_state = 'j'
group by f.family_id

编辑:

如果您只需要返回前50%,您只需将其添加到上面的查询中即可。因为它首先是连接和计数,它将从连接结果中返回50%:

select top 50 percent f.family_id, count(*)
from dbo.Families f
inner join dbo.Children c ON c.family_id = f.family_id
where f.economic_state = 'a' or f.economic_state = 'j'
group by f.family_id

答案 1 :(得分:1)

从Szymon的答案修改,允许您在表格中包含其他列。

select *
FROM
    (select f.family_id, count(*) children
    from dbo.Families f
    inner join dbo.Children c ON c.family_id = f.family_id
    where f.economic_state = 'a' or f.economic_state = 'j'
    group by f.family_id) fc
JOIN dbo.Families f ON f.family_id = fc.family_Id

答案 2 :(得分:0)

使用join和group by:

SELECT children.fid, families.eco_state, count(children.fid) FROM children, families where children.fid= families.id and families.eco_state = 'a'

按children.fid分组

答案 3 :(得分:0)

您可以使用公用表表达式(Cte)来编写具有可读性的此类查询。

;With CteFamily AS
(
SELECT family_id FROM dbo.Families 
--WHERE --Put your conditions to filter family
),
--get childrens count, with family id for selected family
CteChildrenCount AS
(
 SELECT family_id , Count(*) As ChildrenCount
 FROM  dbo.Children 
 WHERE family_id  IN (SELECT family_id FROM CteFamily)
 GROUP BY family_id 
),
--final query to get all other details from family table
CteFamilyDetails AS
(
  SELECT f.economic_state,f.family_id ,ChildrenCount   --Add extra columns from family       --table here
  FROM dbo.Families f
 INNER JOIN CteChildrenCount  c
 ON f.family_id = c.family_id
)
SELECT * FROM CteFamilyDetails;    --End of Cte end with semicolon.