34,571
社区成员
发帖
与我相关
我的任务
分享
select a.*,count(1) 产品数
from t1 a
left join t2 b on a.编号=b.所属大类
left join t3 c on c.所属=b.编号 or c.所属=a.编号
group by a.编号,a.名称
--建立测试环境
IF OBJECT_ID('表T1') IS NOT NULL DROP TABLE 表T1
GO
CREATE TABLE 表T1( 编号 int, 名称 varchar(10))
GO
INSERT 表T1
SELECT 10 ,'家电'union all
SELECT 20 ,'办公'union all
SELECT 30 ,'其它'
go
IF OBJECT_ID('表T2') IS NOT NULL DROP TABLE 表T2
GO
CREATE TABLE 表T2( 编号 int, 名称 varchar(10),所属大类 int)
GO
INSERT 表T2
SELECT 1001 ,'桌类', 10 union all
SELECT 1002 ,'电脑', 20
go
IF OBJECT_ID('表T3') IS NOT NULL DROP TABLE 表T3
GO
CREATE TABLE 表T3( 编号 varchar(1), 名称 varchar(10),所属 int)
GO
INSERT 表T3
SELECT 'A','XXX', 10 union all
SELECT 'B','YYY',1001 union all
SELECT 'C','ZZZ', 1002
--查询
select a.编号,a.名称,产品数=count(b.编号)+count(c.编号) from
(表T1 a left join 表T3 b on b.所属=a.编号)
left join
(表T2 c left join 表T3 d on d.所属=c.编号)
on c.所属大类=a.编号
group by a.编号,a.名称
order by a.编号
--结果
/*
编号 名称 产品数
----------- ---------- -----------
10 家电 2
20 办公 1
30 其它 0
警告: 聚合或其他 SET 操作消除了空值。
(3 行受影响)
*/
(3 行受影响)
(2 行受影响)
(3 行受影响)
编号 名称 产品数
----------- ---------- -----------
10 家电 2
20 办公 1
30 其它 0
警告: 聚合或其他 SET 操作消除了空值。
(3 行受影响)
select a.*,SUM(case when isnull(c.编号,'')='' then 0 else 1 end) 产品数
from t1 a
left join t2 b on a.编号=b.所属大类
left join t3 c on c.所属=b.编号 or c.所属=a.编号 --这个地方不能用b.所属大类代替,因为可以有些大类下面没有小类,这时b.所属大类为null的
group by a.编号,a.名称
select a.*,SUM(case when isnull(c.编号,'')='' then 0 else 1 end) 产品数
from t1 a
left join t2 b on a.编号=b.所属大类
left join t3 c on c.所属=b.编号 or c.所属=b.所属大类
group by a.编号,a.名称
select a.编号,a.名称,COUNT(*) as 产品数 from T1 a
left join T2 b on a.编号=b.所属大类
left join T3 c on c.所属=b.编号 or c.所属=a.编号
group by a.编号,a.名称