MS SQL Server:自查询和子查询的总计数
假设我有以下表格: 表1:fooMS SQL Server:自查询和子查询的总计数,sql,sql-server,Sql,Sql Server,假设我有以下表格: 表1:foo id should_be_counted (bit) 1 1 2 0 3 0 4 1 表2:酒吧 id foo_id should_be_counted (bit) 1 1 0 2 1 1 3 2 1 我如何查询数据,以便获得每个foo的总计数,其中foo.should\u counted=1,以及所有相关条的计数,其中bar.should\u counted=1 预期成果: id co
id should_be_counted (bit)
1 1
2 0
3 0
4 1
表2:酒吧
id foo_id should_be_counted (bit)
1 1 0
2 1 1
3 2 1
我如何查询数据,以便获得每个foo的总计数,其中foo.should\u counted=1,以及所有相关条的计数,其中bar.should\u counted=1
预期成果:
id count
1 2
2 1
3 0
4 1
从客户的回答中获取并更新的样本数据:
DECLARE @foo AS TABLE(id INT, should_be_counted bit)
INSERT INTO @foo VALUES
(1,1),
(2,0),
(3,0),
(4,1)
DECLARE @bar AS TABLE(id INT, foo_id INT, should_be_counted bit)
INSERT INTO @bar VALUES
(1,1,0),
(2,1,1),
(3,2,1)
在我看来,你需要加入并数一数
select f.id,coalesce((count(*),f.should_be_counted)) from foo f left join bar b on f.id=b.foo_id
group by f.id
在我看来,你需要加入并数一数
select f.id,coalesce((count(*),f.should_be_counted)) from foo f left join bar b on f.id=b.foo_id
group by f.id
我认为你只需要:
select f.id, case when b.cnt = 0 then f.should_be_counted else b.cnt end
from foo f outer apply
( select count(*) as cnt
from bar b
where b.foo_id = f.id
) b;
我认为你只需要:
select f.id, case when b.cnt = 0 then f.should_be_counted else b.cnt end
from foo f outer apply
( select count(*) as cnt
from bar b
where b.foo_id = f.id
) b;
简单的左连接和group by将获得您想要的输出
DECLARE @foo AS TABLE(id INT, should_be_counted INT)
INSERT INTO @foo VALUES
(1,1),
(2,0),
(3,0),
(4,1)
DECLARE @bar AS TABLE(id INT, foo_id INT, should_be_counted INT)
INSERT INTO @bar VALUES
(1,1,0),
(2,1,1),
(3,2,1)
SELECT f.id,
COUNT(CASE WHEN f.should_be_counted>0 THEN 1 ELSE NULL END)+MAX(t.tot) AS [count]
FROM @foo f
OUTER APPLY(SELECT COUNT(*) tot
FROM @bar b WHERE b.foo_id = f.id AND b.should_be_counted > 0) t
GROUP BY f.id
输出:
简单的左连接和group by将获得您想要的输出
DECLARE @foo AS TABLE(id INT, should_be_counted INT)
INSERT INTO @foo VALUES
(1,1),
(2,0),
(3,0),
(4,1)
DECLARE @bar AS TABLE(id INT, foo_id INT, should_be_counted INT)
INSERT INTO @bar VALUES
(1,1,0),
(2,1,1),
(3,2,1)
SELECT f.id,
COUNT(CASE WHEN f.should_be_counted>0 THEN 1 ELSE NULL END)+MAX(t.tot) AS [count]
FROM @foo f
OUTER APPLY(SELECT COUNT(*) tot
FROM @bar b WHERE b.foo_id = f.id AND b.should_be_counted > 0) t
GROUP BY f.id
输出:
据我所知,应该计算的数值总是1或0。那么这将是一个简单明了的方法:
select id, sum(cast(should_be_counted as int)) as cnt
from
(
select id, should_be_counted
from foo
union all
select foo_id, should_be_counted
from bar
) tmp
group by id;
注意:我后来看到它是位的,然后会像我说的那样工作。正如我所理解的,应该被计数总是1或0。那么这将是一个简单明了的方法:
select id, sum(cast(should_be_counted as int)) as cnt
from
(
select id, should_be_counted
from foo
union all
select foo_id, should_be_counted
from bar
) tmp
group by id;
注意:我后来看到它是位的,然后会像我说的那样工作。为什么值1的计数为2?您使用的逻辑是什么?它的计数为2,因为它应该被计数,并且它有一个也应该被计数的条形条目。也许向我们展示您的尝试可以帮助我们理解您的目标/逻辑。您应该阅读以下内容:为什么值1的计数为2?您使用的是什么逻辑?它的计数为2,因为它应该被计数,并且它有一个也应该被计数的条形条目。也许向我们展示您的尝试可以帮助我们理解您的目标/逻辑。您应该阅读以下内容:应该被计数是类型位,它在add运算符中不兼容。这就是为什么您应该在问题,这有助于防止人们浪费时间@正如预期的那样,苏桑成功了。为什么使用位>0而不是位=1?另外,为什么对t.tot使用MAX和not SUM?Count函数将任何not null值视为1,所以我添加了条件>0。使用MAX避免group by中的此列,是的,您也可以使用SUM代替或仅使用t.tot,并将其放置在group by子句中,作为group by f.id,t.tot.PRODUCT_被_计数是bit类型,在add运算符中不兼容。这就是为什么您在问题中应提供DDL的原因,它有助于防止人们浪费时间@苏桑,它按预期工作。为什么使用位>0而不是位=1?另外,为什么对t.tot使用MAX和not SUM?Count函数将任何not null值视为1,所以我添加了条件>0。使用MAX避免group by中的此列,是的,您也可以使用SUM代替或仅使用t.tot,并将其放置在group by子句中,作为group by f.id,t.tot。a.应该从何处计算?fooid=4的结果为0,这是不正确的。它应该是1,因为它本身应该被计算。@jhwillams。是的,您需要案例表达。您的更新答案有效。我只需要一分钟来弄清楚原因/方式。谢谢a.应该从何处计算?fooid=4的结果是0,这是不正确的。它应该是1,因为它本身应该被计算。@jhwillams。是的,您需要案例表达。您的更新答案有效。我只需要一分钟来弄清楚原因/方式。感谢应该被计数为0或1位。@jhwilliams,是的,我后来看到了。然后它就可以做你想做的事情了。应该计数的类型是0位还是1位。@jhwilliams,是的,我后来看到了。然后它会做你想做的事。