SQL 服务器:交叉应用 - 为 NULL 结果记录 0
SQL Server: Cross-apply - record 0 for NULL results
T1 是 table 公司及其(多个用户),T2 是 table 注册用户。我计算了,对于 T1 中的每个公司,他们有多少用户在 T2 中,但需要 c3 出现在结果中 table with #regUser == 0:
T1:
company user
c1 u1
c1 u2
c2 u2
c2 u3
c3 u4
c3 u1
T2:
user
u2
u3
因此结果 table 应该如下所示:
company #regUser
c1 1
c2 2
c3 0
使用以下代码,我只获得非空公司的结果:
select t1s.company, count(1)
from (select * from t1) t1s
cross apply (select *
from t2 t2s
where t2s.reguser = t1s.[user]) t12s
group by t1s.company
谢谢
只需使用左连接
select t1.company,count(t2.user)
from t1 left join t2 on t1.user=t2.user
group by t1.company
根据您的要求不需要子查询
但是如果你想使用 apply
那么你需要像下面的查询
select t1s.company, count(t12s.Users)
from (select * from t1) t1s
outer apply (select Users
from t2 t2s
where t2s.Users = t1s.[Users]) t12s
group by t1s.company
产出
company #regUser
c1 1
c2 2
c3 0
您可以使用 LEFT JOIN
获取左侧 table 的所有信息以及右侧 table 的匹配信息。通过使用 GROUP BY
,您可以按公司对行进行分组,并获得每个公司的 COUNT
注册用户:
SELECT t1.company, COUNT(t2.[user]) AS regUser
FROM t1 LEFT JOIN t2 ON t1.[user] = t2.[user]
GROUP BY t1.company
ORDER BY t1.company ASC
你也可以使用CROSS APPLY
来解决这个问题:
SELECT t1.company, SUM(CASE WHEN t1.[user] = t2.[user] THEN 1 ELSE 0 END) AS regUser
FROM t1 CROSS APPLY t2
GROUP BY t1.company
ORDER BY t1.company ASC
你只需要一个左连接:
select company,count(t2.[user])
from t1 left outer join t2 on t1.[user]=t2.[user]
group by company
问题的查询过于复杂。例如,from (select * from t1) t1s
等同于 from t1 as t1s
。
只是 LEFT JOIN
和 SUM()
CREATE TABLE T1(
Company VARCHAR(20),
Users VARCHAR(20)
);
CREATE TABLE T2(
Users VARCHAR(20)
);
INSERT INTO T1 VALUES
('c1', 'u1'),
('c1', 'u2'),
('c2', 'u2'),
('c2', 'u3'),
('c3', 'u4'),
('c3', 'u1');
INSERT INTO T2 VALUES
('u2'),
('u3');
SELECT T1.Company,
SUM(CASE WHEN T2.Users IS NULL THEN 0 ELSE 1 END) Cnt
FROM T1 LEFT JOIN T2
ON T1.Users = T2.Users
GROUP BY T1.Company;
Returns:
+---------+-----+
| Company | Cnt |
+---------+-----+
| c1 | 1 |
| c2 | 2 |
| c3 | 0 |
+---------+-----+
T1 是 table 公司及其(多个用户),T2 是 table 注册用户。我计算了,对于 T1 中的每个公司,他们有多少用户在 T2 中,但需要 c3 出现在结果中 table with #regUser == 0:
T1:
company user
c1 u1
c1 u2
c2 u2
c2 u3
c3 u4
c3 u1
T2:
user
u2
u3
因此结果 table 应该如下所示:
company #regUser
c1 1
c2 2
c3 0
使用以下代码,我只获得非空公司的结果:
select t1s.company, count(1)
from (select * from t1) t1s
cross apply (select *
from t2 t2s
where t2s.reguser = t1s.[user]) t12s
group by t1s.company
谢谢
只需使用左连接
select t1.company,count(t2.user)
from t1 left join t2 on t1.user=t2.user
group by t1.company
根据您的要求不需要子查询
但是如果你想使用 apply
那么你需要像下面的查询
select t1s.company, count(t12s.Users)
from (select * from t1) t1s
outer apply (select Users
from t2 t2s
where t2s.Users = t1s.[Users]) t12s
group by t1s.company
产出
company #regUser
c1 1
c2 2
c3 0
您可以使用 LEFT JOIN
获取左侧 table 的所有信息以及右侧 table 的匹配信息。通过使用 GROUP BY
,您可以按公司对行进行分组,并获得每个公司的 COUNT
注册用户:
SELECT t1.company, COUNT(t2.[user]) AS regUser
FROM t1 LEFT JOIN t2 ON t1.[user] = t2.[user]
GROUP BY t1.company
ORDER BY t1.company ASC
你也可以使用CROSS APPLY
来解决这个问题:
SELECT t1.company, SUM(CASE WHEN t1.[user] = t2.[user] THEN 1 ELSE 0 END) AS regUser
FROM t1 CROSS APPLY t2
GROUP BY t1.company
ORDER BY t1.company ASC
你只需要一个左连接:
select company,count(t2.[user])
from t1 left outer join t2 on t1.[user]=t2.[user]
group by company
问题的查询过于复杂。例如,from (select * from t1) t1s
等同于 from t1 as t1s
。
只是 LEFT JOIN
和 SUM()
CREATE TABLE T1(
Company VARCHAR(20),
Users VARCHAR(20)
);
CREATE TABLE T2(
Users VARCHAR(20)
);
INSERT INTO T1 VALUES
('c1', 'u1'),
('c1', 'u2'),
('c2', 'u2'),
('c2', 'u3'),
('c3', 'u4'),
('c3', 'u1');
INSERT INTO T2 VALUES
('u2'),
('u3');
SELECT T1.Company,
SUM(CASE WHEN T2.Users IS NULL THEN 0 ELSE 1 END) Cnt
FROM T1 LEFT JOIN T2
ON T1.Users = T2.Users
GROUP BY T1.Company;
Returns:
+---------+-----+
| Company | Cnt |
+---------+-----+
| c1 | 1 |
| c2 | 2 |
| c3 | 0 |
+---------+-----+