行转列求一sql(100分奉上,在线等,得正解立刻给分)!!!
表A:pk为a1;
a1(工资项编号),a2(工资项名称),a3(工资类别)
-------------------------------------------
a001 基本工资 00
a002 饭补 00
a003 奖金 01
a004 绩效工资 01
a005 所得税 02
表B:pk为b1,a1;
a1(工资项编号),b1(编号), b2(金额)
-------------------------------------------
a001 b001 50
a002 b002 50
a003 b003 100
a005 b004 -40
结果:注:a3(工资类别)只能有00,01,03这三种。
类别一(00) 类别二 (02) 类别三(03)
----------------------------------------------------------------
基本工资50,饭补50 绩效工资100 所得税-40
请问这个sql怎么写?
问题点数:100、回复次数:21Top
1 楼xzy825(小菜鸟)回复于 2006-08-18 16:31:50 得分 0
问个问题oracle中如何把某一列(varchar型)的结果连接起来组成一个新字符串?Top
2 楼sxykje(我爱老婆)回复于 2006-08-18 16:34:38 得分 0
column1 || column2连接Top
3 楼xzy825(小菜鸟)回复于 2006-08-18 16:36:36 得分 0
楼上的大哥不是把两列连到一起,是把一列中的若干行连到一起。Top
4 楼feng2(蜀山风云)回复于 2006-08-18 17:49:15 得分 0
类别一(00) 类别二 (02) 类别三(03)
----------------------------------------------------------------
基本工资50,饭补50 绩效工资100 所得税-40
这里的类别有些混乱吧?
还有,类别二得到的结果是“奖金100”而不是“绩效工资100”,是么?
要实现这个逻辑,重要的是使用以下2个函数:
sys_connect_by_path()和row_number()over()
剩下的自己做做看。Top
5 楼wiler(@_@)回复于 2006-08-20 17:29:04 得分 0
1.写一个函数
create or replace function GetString(gz_type varchar2) return varchar2 is
Result varchar2(2000);
v_Str varchar2(200);
cursor c_Str is
select A.a2||B.b2 from A , B
where A.a1=B.a1 and A.a3=gz_type;
begin
Result :=' ';
open c_table;
loop
fetch c_Str into v_Str;
exit when c_Str%NOTFOUND;
Result := Result||v_Str;
end loop;
close c_table;
return(Result);
end GetString;
2.select GetString('00') "类别一(00)",GetString('01') "类别二(02)",GetString('03') "类别三(03)" from dualTop
6 楼dawugui(潇洒老乌龟)回复于 2006-08-20 17:32:52 得分 0
0047 -- SQL语句之合并行列转换
有表rowtocol,其数据如下:
a b
1 1
1 2
1 3
2 1
2 2
3 1
如何转换成如下结果:
a b
1 1,2,3
2 1,2
3 1
创建一个合并的函数
create function f_rowtocol(@a int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(b as varchar) from rowtocol where a = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go
调用自定义函数得到结果:
select distinct a ,dbo.f_rowtocol(a) from rowtocol
Top
7 楼dawugui(潇洒老乌龟)回复于 2006-08-20 17:33:20 得分 0
0046 -- SQL语句之普通行列转换
假设有张学生成绩表(tb_rowtocol)如下
Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94
declare @sql varchar(4000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
from (select distinct Subject from rowtocol) as a
set @sql = @sql + ' from rowtocol group by name'
exec(@sql)
如果上述两表互相换一下:即
表名(cj)
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94
想变成
Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
select 姓名 as Name,'语文' as Subject,语文 as Result from CJ union
select 姓名 as Name,'数学' as Subject,数学 as Result from CJ union
select 姓名 as Name,'物理' as Subject,物理 as Result from CJ
order by 姓名 desc
Top
8 楼Eric_1999(╙@^@╜)回复于 2006-08-21 08:42:27 得分 0
搂主的意思是把三个类型的b2加起来吧??
还要把两列合并吗?说清楚点吧。Top
9 楼smilingchen(钝哥)回复于 2006-08-21 10:26:36 得分 0
关注Top
10 楼xzy825(小菜鸟)回复于 2006-08-21 11:53:12 得分 0
除了使用存储过程,用sql写不出来吗?Top
11 楼xzy825(小菜鸟)回复于 2006-08-21 11:56:11 得分 0
更正一下,类型那个地方错了。
表A:pk为a1;
a1(工资项编号),a2(工资项名称),a3(工资类别)
-------------------------------------------
a001 基本工资 00
a002 饭补 00
a003 奖金 01
a004 绩效工资 01
a005 所得税 02
表B:pk为b1,a1;
a1(工资项编号),b1(编号), b2(金额)
-------------------------------------------
a001 b001 50
a002 b002 50
a003 b003 100
a005 b004 -40
结果:注:a3(工资类别)只能有00,01,02这三种。
类别一(00) 类别二 (01) 类别三(02)
----------------------------------------------------------------
基本工资50,饭补50 绩效工资100 所得税-40
请问这个sql怎么写?
Top
12 楼feng2(蜀山风云)回复于 2006-08-21 14:54:53 得分 0
SQL> select * from a;
ITEM_NO ITEM_SUB_NO ITEM_NAME
------- ----------- --------------------
a001 基本工资 00
a002 饭补 00
a003 奖金 01
a004 绩效工资 01
a005 所得税 02
SQL> select * from b;
ITEM_NO ITEM_SUB_NO ITEM_CODE
------- ----------- --------------------
a001 b001 50
a002 b002 50
a003 b003 100
a005 b004 -40
select max(A) "类别一(00)",max(B) "类别二(01)",max(C) "类别三(02)" from(
select case when item_name = '00' then k end A,
case when item_name = '01' then k end B,
case when item_name = '02' then k end C
from
(
select item_name,substr(replace(max(sys_connect_by_path(code,',')),',',','),2) K
from
(
select t.*,row_number()over(partition by item_name order by item_name) rn
from
(select a.item_name,a.item_sub_no||b.item_code code from a,b where a.item_no=b.item_no) t
)
start with rn=1
connect by rn = prior rn+1
and item_name = prior item_name
group by item_name
)
)
;
类别一(00) 类别二(01) 类别三(02)
-------------------------- -------------------------- ---------------------------------------
基本工资50,饭补50 奖金100 所得税-40Top
13 楼feng2(蜀山风云)回复于 2006-08-21 14:57:14 得分 0
select substr(max(A),1,20) "类别一(00)",substr(max(B),1,20) "类别二(01)",substr(max(C),1,20) "类别三(02)" from
.....
类别一(00) 类别二(01) 类别三(02)
-------------------- -------------------- --------------------
基本工资50,饭补50 奖金100 所得税-40
SQL>Top
14 楼licsth(北京三毛)回复于 2006-08-21 17:10:50 得分 0
这种要求,写成一个sql真是要命;笨招是建立每种 表A.工资项名称 的子表、每种表B.编号||表B.金额,之后几层嵌套+decode下来;稍微聪明点的就是‘feng2(蜀山风云) ’那种高深的sql了;
建议:后台代码判断,而非sql完成,这么复杂的逻辑分支搞个研究试试还可以,作实际项目有点本本了!Top
15 楼licsth(北京三毛)回复于 2006-08-21 17:11:46 得分 0
追加:lz不要给我分了!Top
16 楼utilities(幸福一生)回复于 2006-08-21 20:06:56 得分 0
select count(*),sum(decode(useid,1,1,0)) useid1,
sum(decode(useid,2,1,0)) useid2,
sum(decode(useid,3,1,0)) useid3,
sum(decode(twouseid,1,1,0)) twouseid1,
sum(decode(twouseid,2,1,0)) twouseid2,
sum(decode(twouseid,3,1,0)) twouseid3
from table1
group by ordid
Top
17 楼Eric_1999(╙@^@╜)回复于 2006-08-22 08:53:57 得分 0
行列转换
select name,sum(decode(course,'语文', grade,null)) "语文",
sum(decode(course,'数学', grade,null)) "数学",
sum(decode(course,'英语', grade,null)) "英语"
from student
group by name
--不定列转换
C1 C2
---------- ----------
1 我
1 是
1 谁
2 知
2 道
3 不Top
18 楼Eric_1999(╙@^@╜)回复于 2006-08-22 09:41:38 得分 0
应该是这样。
select sum(decode(b2,'00', grade,null)) "类别一(00)",
sum(decode(b2,'01', grade,null)) "类别二(01)",
sum(decode(b2,'02', grade,null)) "类别三(02)"
from A , B
where A.a1 = B.a1(+)
group A.a3Top
19 楼Eric_1999(╙@^@╜)回复于 2006-08-22 09:43:54 得分 0
不好意思,写错了。下面的才是。
select sum(decode(a3, '00', B.b2, null)) "类别一(00)",
sum(decode(a3, '01', B.b2, null)) "类别二(01)",
sum(decode(a3, '02', B.b2, null)) "类别三(02)"
from A , B
where A.a1 = B.a1(+)
group A.a3
Top
20 楼chenquan(逍遥无忌)回复于 2006-08-22 16:59:46 得分 0
类似方法,参考: utilities(幸福一生)Top
21 楼LinZhongBao(【豹哥】)回复于 2006-08-22 23:12:53 得分 0
哦,不错Top




