我有一个类似于下面的表结构:
declare @t1 table (code varchar)
declare @t2 table (id int, code varchar, closed bit)
@ t2保持打开/关闭@ t1中的代码:
insert into @t1 values ('x')
insert into @t2 values (1, 'x', 1)
insert into @t2 values (2, 'x', 1)
insert into @t2 values (3, 'x', 0)
我正在尝试获取代码的打开/关闭计数:
select
count (t2_open.id) as opencount
, count (t2_closed.id) as closecount
from @t1 t1
inner join @t2 t2_open on t2_open.code = t1.code AND t2_open.closed = 0
inner join @t2 t2_closed on t2_closed.code = t1.code AND t2_closed.closed = 1
返回2& 2,我看不出我在这里做错了什么,为什么不回归1& 2?
不应该从我的查询中选择*返回null并且当记录不匹配时返回正确的计数?我期待select *返回3条记录,但它返回2条记录,其中两行中的id为3。
答案 0 :(得分:3)
您计算的总记录数不是单个值
SELECT t1.code,
Count (CASE WHEN t2.closed = 1 THEN 1 END) AS opencount,
Count (CASE WHEN t2.closed = 0 THEN 1 END) AS closecount
FROM @t1 t1
LEFT JOIN @t2 t2
ON t2.code = t1.code
GROUP BY t1.code
更新:
让我们分解联接
SELECT t1.code,t2_open.closed
FROM @t1 t1
INNER JOIN @t2 t2_open
ON t2_open.code = t1.code
AND t2_open.closed = 0
在第一次加入时,您将拉出关闭= 0的记录,因此结果将类似于
+------+--------+
| code | closed |
+------+--------+
| x | 0 |
+------+--------+
现在,在上述结果的基础上,您将使用代码加入@ t2并关闭= 1
SELECT t1.code,t2_open.closed,t2_closed.closed
FROM @t1 t1
INNER JOIN @t2 t2_open
ON t2_open.code = t1.code
AND t2_open.closed = 0
INNER JOIN @t2 t2_closed
ON t2_closed.code = t1.code
AND t2_closed.closed = 1
我们有两个关闭= 1的记录,对于相同的代码,当我们加入前一个结果时,关闭也将重复两次,因为两个关闭= 1
+------+--------+--------+
| code | closed | closed |
+------+--------+--------+
| x | 0 | 1 |
| x | 0 | 1 |
+------+--------+--------+
正如你所看到的,我们在加入后有两个关闭= 0,所以在计算时你会看到两个接近计数