问一条统计用的SQl语句

Magicwords 2010-07-06 11:47:33
表T1

编号 名称
------------------
10 家电
20 办公
30 其它



表T2
编号 名称 所属大类
--------------------------------
1001 桌类 10
1002 电脑 20


表T3
编号 名称 所属
------------------------------------
A XXX 10
B YYY 1001
C ZZZ 1002

表T3中,【所属】这一列中的值可以是T1中的也可以是T2中的,现在要用一条语句统计出
大类(T1)中的每个类所有的产品

编号(T1) 名称 产品数
----------------------------------------
10 家电 2
20 办公 1
30 其它 0

这个问题我问过一次,http://topic.csdn.net/u/20100422/15/b9ad5fb1-18ca-418f-b419-0cb170f03fd6.html,但是当时的问题中没有 30 其它 0这一项,也就是说当有大类没有产品时就不会被查出来,但是我需要查出来,请达人指点下,谢谢
...全文
133 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy_liucj 2010-07-06
  • 打赏
  • 举报
回复
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.名称
永生天地 2010-07-06
  • 打赏
  • 举报
回复
select a.编号,a.名称,产品数=count(c.编号)
from 表T1 a left join 表T2 b on b.所属大类=a.编号
left join 表T3 c on c.所属=a.编号 or c.所属=b.编号
group by a.编号,a.名称
order by a.编号
永生天地 2010-07-06
  • 打赏
  • 举报
回复
--建立测试环境
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 行受影响)


*/
永生天地 2010-07-06
  • 打赏
  • 举报
回复

(3 行受影响)

(2 行受影响)

(3 行受影响)
编号 名称 产品数
----------- ---------- -----------
10 家电 2
20 办公 1
30 其它 0
警告: 聚合或其他 SET 操作消除了空值。

(3 行受影响)

Magicwords 2010-07-06
  • 打赏
  • 举报
回复
8楼的,那个不行,30 其它 0
这一条查不出来
nightmaple 2010-07-06
  • 打赏
  • 举报
回复
7楼的有点问题
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.名称
jstoic 2010-07-06
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100422/15/b9ad5fb1-18ca-418f-b419-0cb170f03fd6.html

刚才看了一下,你这篇文章的第二个答案就可以
nightmaple 2010-07-06
  • 打赏
  • 举报
回复
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.名称
nightmaple 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 magicwords 的回复:]
IF NOT OBJECT_ID('[t1]') IS NULL
DROP TABLE [t1]
GO
CREATE TABLE [t1]([编号] INT,[名称] NVARCHAR(10))
INSERT [t1]
SELECT 10,N'家电' UNION ALL
SELECT 20,N'办公' UNION ALL
SELECT 30,N'其它'
GO
--SELEC……
[/Quote]

改成这样吧
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.名称
Magicwords 2010-07-06
  • 打赏
  • 举报
回复
如大类10,那么表T3里面的B算不算里面的?

算的
jstoic 2010-07-06
  • 打赏
  • 举报
回复
你的统计算法
如大类10,那么表T3里面的B算不算里面的?

Magicwords 2010-07-06
  • 打赏
  • 举报
回复
IF NOT OBJECT_ID('[t1]') IS NULL
DROP TABLE [t1]
GO
CREATE TABLE [t1]([编号] INT,[名称] NVARCHAR(10))
INSERT [t1]
SELECT 10,N'家电' UNION ALL
SELECT 20,N'办公' UNION ALL
SELECT 30,N'其它'
GO
--SELECT * FROM [t1]

--> 生成测试数据表:T2

IF NOT OBJECT_ID('[T2]') IS NULL
DROP TABLE [T2]
GO
CREATE TABLE [T2]([编号] INT,[名称] NVARCHAR(10),[所属大类] INT)
INSERT [T2]
SELECT 1001,N'桌类',10 UNION ALL
SELECT 1002,N'电脑',20
GO
--SELECT * FROM [T2]

--> 生成测试数据表:T3

IF NOT OBJECT_ID('[T3]') IS NULL
DROP TABLE [T3]
GO
CREATE TABLE [T3]([编号] NVARCHAR(10),[名称] NVARCHAR(10),[所属] INT)
INSERT [T3]
SELECT 'A','XXX',10 UNION ALL
SELECT 'B','YYY',1001 UNION ALL
SELECT 'C','ZZZ',1002
GO
--SELECT * FROM [T3]

-->SQL查询如下:
select a.*,count(*) 产品数
from t1 a
left join t2 b on a.编号=b.所属大类
left join t3 c on c.所属=b.编号 or c.所属=b.所属大类
group by a.编号,a.名称
Magicwords 2010-07-06
  • 打赏
  • 举报
回复
1楼的好像不对啊,查出来后,30 其它 1
正确的应该是:
30 其它 0
nightmaple 2010-07-06
  • 打赏
  • 举报
回复
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.名称
Magicwords 2010-07-06
  • 打赏
  • 举报
回复
select a.编号,a.名称,产品数=count(c.编号)
from 表T1 a left join 表T2 b on b.所属大类=a.编号
left join 表T3 c on c.所属=a.编号 or c.所属=b.编号
group by a.编号,a.名称
order by a.编号
Magicwords 2010-07-06
  • 打赏
  • 举报
回复
IF NOT OBJECT_ID('[t1]') IS NULL
DROP TABLE [t1]
GO
CREATE TABLE [t1]([编号] INT,[名称] NVARCHAR(10))
INSERT [t1]
SELECT 10,N'家电' UNION ALL
SELECT 20,N'办公' UNION ALL
SELECT 30,N'其它'
GO
--SELECT * FROM [t1]

--> 生成测试数据表:T2

IF NOT OBJECT_ID('[T2]') IS NULL
DROP TABLE [T2]
GO
CREATE TABLE [T2]([编号] INT,[名称] NVARCHAR(10),[所属大类] INT)
INSERT [T2]
SELECT 1001,N'桌类',10 UNION ALL
SELECT 1002,N'电脑',20
GO
--SELECT * FROM [T2]

--> 生成测试数据表:T3

IF NOT OBJECT_ID('[T3]') IS NULL
DROP TABLE [T3]
GO
CREATE TABLE [T3]([编号] NVARCHAR(10),[名称] NVARCHAR(10),[所属] INT)
INSERT [T3]
SELECT 'A','XXX',10 UNION ALL
SELECT 'D','XXX',20 UNION ALL
SELECT 'B','YYY',1002 UNION ALL
SELECT 'E','YYY',30 UNION ALL
SELECT 'C','ZZZ',1002
GO
--SELECT * FROM [T3]

-->SQL查询如下:
select a.*,count(c.所属) 产品数
from t1 a
left join t2 b on a.编号=b.所属大类
left join t3 c on c.所属=b.编号 or c.所属=a.编号
group by a.编号,a.名称

上面这样就对了
skyinglin 2010-07-06
  • 打赏
  • 举报
回复
学习学习

34,571

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧