Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS SQL Server:自查询和子查询的总计数_Sql_Sql Server - Fatal编程技术网

MS SQL Server:自查询和子查询的总计数

MS 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

假设我有以下表格:

表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  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,是的,我后来看到了。然后它会做你想做的事。