我又想到一个问题,做个修改哈
如下:
A表 SVINFO_PROBLEM_MST
id problem_name
1 数据更新
2 天气预报
3 主机维修
4 病毒感染
5 主机硬件
B表 SVINFO_REPAIR_MST
id problem add_Time repair_name
1 病毒感染 2008-1-1 小张
2 主机维修 2008-1-3 小李
3 病毒感染 2008-1-2 小张
4 数据更新 2008-1-1 小张
5 主机硬件,主机维修 2008-2-1 小张 //---------这里做了修改--------//
没修改前的sql语句如下
SQL code
select t1.problem_name,t1.repair_name,count(t2.record_id) 记录数
from
(select a.repair_name,b.problem_name from
(select distinct repair_name from SVINFO_REPAIR_MST where add_time between '2008-1-1' and '2008-1-2')a,
SVINFO_PROBLEM_MST as b)t1
left join
SVINFO_REPAIR_MST t2
on t1.problem_name=t2.problem collate Chinese_PRC_CI_AS
and t1.repair_name=t2.repair_name
group by t1.repair_name,t1.problem_name
order by t1.repair_name desc
当B表 SVINFO_REPAIR_MST中的problem字段做了修改后,
显示结果要下面这样:
-------- -------- -----------
小张 数据更新 1
小张 天气预报 0
小张 主机维修 1
小张 病毒感染 2
小张 主机硬件 1
小李 数据更新 0
小李 天气预报 0
小李 主机维修 1
小李 病毒感染 0
小李 主机硬件 0
sql语句如何实现
???
这个问题第1个回答:
只能是先分解后,再做LEFT JOIN的连接,分解的方法见下:
分拆列值
原著:邹建
改编:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-12-16 广东深圳
有表tb, 如下:
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
欲按id,分拆value列, 分拆后结果如下:
id value
----------- --------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
1. 旧的解决方法(sql server 2000)
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b
SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','
DROP TABLE #
2. 新的解决方法(sql server 2005)
create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go
SELECT A.id, B.value
FROM(
SELECT id, [value] = CONVERT(xml,' <root> <v>' + REPLACE([value], ',', ' </v> <v>') + ' </v> </root>') FROM tb
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)B
DROP TABLE tb
/*
id value
----------- ------------------------------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
(5 行受影响)
*/
这个问题第2个回答:
SQL code
select t1.problem_name,t1.repair_name,count(t2.record_id) 记录数
from
(select a.repair_name,b.problem_name from
(select distinct repair_name from SVINFO_REPAIR_MST where add_time between '2008-1-1' and '2008-1-2')a,
SVINFO_PROBLEM_MST as b)t1
left join
SVINFO_REPAIR_MST t2
on t1.problem_name=t2.problem collate Chinese_PRC_CI_AS
and t1.repair_name=t2.repair_name and t2.add_time between '2008-1-1' and '2008-1-2'--加上條件
group by t1.repair_name,t1.problem_name
order by t1.repair_name desc
这个问题第3个回答:
楼主,你在个统计结果有时间限制吗?好象是没加上时间限制前的结果吧?
这个问题第4个回答:
恩,2楼说的对,刚才还掉了这个。。。呵呵`
这个问题第5个回答:
SQL code
--> 测试数据: [SVINFO_PROBLEM_MST]
if object_id('[SVINFO_PROBLEM_MST]') is not null drop table [SVINFO_PROBLEM_MST]
create table [SVINFO_PROBLEM_MST] (id int,problem_name varchar(8))
insert into [SVINFO_PROBLEM_MST]
select 1,'数据更新' union all
select 2,'天气预报' union all
select 3,'主机维修' union all
select 4,'病毒感染' union all
select 5,'主机硬件'
--> 测试数据: [SVINFO_REPAIR_MST]
if object_id('[SVINFO_REPAIR_MST]') is not null drop table [SVINFO_REPAIR_MST]
create table [SVINFO_REPAIR_MST] (record_id int,problem varchar(50),add_Time varchar(8),repair_name varchar(8))
insert into [SVINFO_REPAIR_MST]
select 1,'病毒感染','2008-1-1','小张' union all
select 2,'主机维修','2008-1-3','小李' union all
select 3,'病毒感染','2008-1-2','小张' union all
select 4,'数据更新','2008-1-1','小张' union all
select 5,'主机硬件,主机维修','2008-2-1','小张'
--加上时间限制的话:
select t1.problem_name,t1.repair_name,count(t2.record_id) 记录数
from [1] [2] 下一页