求一SQL

gekie 2005-01-19 03:55:50
如下表:

A列 | B列
----------------
A | 2
B | 2
A、B | 1


现求一SQL能将上面数据合成如下结果:

A列 | B列
----------------
A | 3
B | 3

即将表数据进行模糊汇总,第三行中都有A,B的数据,所以就统计到A、B各列
...全文
127 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
iswear428 2005-01-19
  • 打赏
  • 举报
回复
internetcsdn(公元1979年8月10日) ( )的办法很强啊
弓虽丁页
internetcsdn 2005-01-19
  • 打赏
  • 举报
回复
上面的东东就只得.

执行一个动态的SQL语句及一个replace函数
internetcsdn 2005-01-19
  • 打赏
  • 举报
回复
觉得关键是在把
A、B | 1
拆分成
A |1
B |1
也即是把字符串
A、B
拆分成
A
B



对于字符串的拆分,
下面是一个例子.
--转载


--http://expert.csdn.net/Expert/topic/3020/3020661.xml?temp=.4630701
--建表
create table a(id int, name varchar(30))
go
--加数据
insert a
select
1, '水泥,石灰,黄沙'
union all
select
2, '砖头'
union all
select
3, '水泥,石子,油漆'
union all
select
4, '木材,玻璃,地板,窗'
go

--测试语句
declare @s varchar(2000)
set @s=''
select @s=@s+Name+',' from a
set @s=left(@s,len(@s)-1)
declare @sql varchar(2000)
set @sql=replace(@s,',',''' union select ''')
set @sql='set nocount on create table #t(id int IDENTITY(1,1),name varchar(20)) insert #t(name) select '''+@sql+''' select * from #t drop table #t'

exec(@sql)

--结果
id name
----------- --------------------
1 玻璃
2 窗
3 地板
4 黄沙
5 木材
6 石灰
7 石子
8 水泥
9 油漆
10 砖头

--去表
drop table a


子陌红尘 2005-01-19
  • 打赏
  • 举报
回复
select
b.A列,
sum(a.B列)
from
表 a,
(select distinct A列 from 表 where charindex('、',A列) < 1) b
where
a.A列 = b.A列
or
a.A列 like b.A列+'、%'
or
a.A列 like '%、'+b.A列+'、%'
or
a.A列 like '%、'+b.A列
group by
b.A列
iswear428 2005-01-19
  • 打赏
  • 举报
回复
根据情况只能把A字段里面带有,的拆分了,进入到一个临时表里面,形成
A列| B列
----------------
A| 1
B| 1
A| 1
 B|1

然后进行group by统计了
Softlee81307 2005-01-19
  • 打赏
  • 举报
回复

---------------把下面的拷貝到sql中直接執行就可----
Create Table test
(
A varchar(30) null,
B int
)

insert into test
select 'A',2 union
select 'B',2 union
select 'A,B',1 union
Select 'C',5
-----------------------------------------下面是sql語句 把表和字段改成自己的就可以----
select K.A,B=sum(isnull(k.B,0)+isnull(P.B,0)) from -----這裡補上isnull 處理
(select * from Test where charindex(',',A)<1) K
left join
(select * from Test where charindex(',',A)>0) P
On (charindex(K.A,P.A)>0)
Group by K.A
-----------------------輸出結果--
A 3
B 3

drop table test
Softlee81307 2005-01-19
  • 打赏
  • 举报
回复

---------------把下面的拷貝到sql中直接執行就可----
Create Table test
(
A varchar(30) null,
B int
)

insert into test
select 'A',2 union
select 'B',2 union
select 'A,B',1
-----------------------------------------下面是sql語句 把表和字段改成自己的就可以----
select K.A,B=sum(k.B+P.B) from
(select * from Test where charindex(',',A)<1) K -------把這個結果作為一個表
left join
(select * from Test where charindex(',',A)>0) P -------把這個結果作為一個表
On (charindex(K.A,P.A)>0) ------- 再左連----------
Group by K.A ------按主表分組---------
-----------------------輸出結果--
A 3
B 3
Softlee81307 2005-01-19
  • 打赏
  • 举报
回复

---------------把下面的拷貝到sql中直接執行就可----
Create Table test
(
A varchar(30) null,
B int
)

insert into test
select 'A',2 union
select 'B',2 union
select 'A,B',1
-----------------------------------------下面是sql語句 把表和字段改成自己的就可以----
select K.A,B=sum(k.B+P.B) from
(select * from Test where charindex(',',A)<1) K
left join
(select * from Test where charindex(',',A)>0) P
On (charindex(K.A,P.A)>0)
Group by K.A
-----------------------輸出結果--
A 3
B 3
gekie 2005-01-19
  • 打赏
  • 举报
回复
楼上可是Oracle的写法?
zmgowin 2005-01-19
  • 打赏
  • 举报
回复
这样写也有它的限制,呵呵
zmgowin 2005-01-19
  • 打赏
  • 举报
回复
16:45:11 SQL> select * from t1;
A 2
B 2
A、B 1

已用时间: 00: 00: 00.16
16:45:12 SQL> create or replace function tes(tp_a in varchar) return number as
16:45:18 2 res number;
16:45:18 3 cursor cur1 is select b from t1 where a like '%'||tp_a||'%';
16:45:18 4 begin
16:45:18 5 res:=0;
16:45:18 6 for cur2 in cur1 loop
16:45:18 7 res:=res+cur2.b;
16:45:18 8 end loop;
16:45:18 9 return res;
16:45:18 10 end;
16:45:18 11 /

函数已创建。

已用时间: 00: 00: 00.32
16:45:18 SQL> select a,tes(a) from t1 where length(a)=1;
A 3
B 3

已用时间: 00: 00: 00.00
gekie 2005-01-19
  • 打赏
  • 举报
回复
楼上的只能对于表中的数据是A或B而言,如果数据就是这个或者说数据是不确定的,这样就行不通了
baojianjun 2005-01-19
  • 打赏
  • 举报
回复
SQL> select * from bao_temp
2 /

NAME TIME MONEY
---------- -------------------- ----------
A 2
B 2
A,B 1

選取了 3 列

目前歷時: 00:00:00.31
----------------------------------------------
SQL> select * from (
2 select name,sum(money) from (
3 select decode(instr(name,'A'),0,'','A') name,money from bao_temp)
4 group by name
5 UNION select name,sum(money) from (
6 select decode(instr(name,'B'),0,'','B') name,money from bao_temp)
7 group by name)
8 where name is not null
9 /

N SUM(MONEY)
- ----------
A 3
B 3

選取了 2 列

目前歷時: 00:00:00.31

但是隻能對這個表而言,沒有通用性
yxxx 2005-01-19
  • 打赏
  • 举报
回复
坐沙发关注

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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