行转列求一sql(100分奉上,在线等,得正解立刻给分)!!!

xzy825 2006-08-18 04:21:39
表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怎么写?
...全文
559 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinZhongBao 2006-08-22
  • 打赏
  • 举报
回复
哦,不错
Eric_1999 2006-08-22
  • 打赏
  • 举报
回复
不好意思,写错了。下面的才是。

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
Eric_1999 2006-08-22
  • 打赏
  • 举报
回复
应该是这样。

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.a3
Eric_1999 2006-08-22
  • 打赏
  • 举报
回复
行列转换
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 不
chenquan 2006-08-22
  • 打赏
  • 举报
回复
类似方法,参考: utilities(幸福一生)
xzy825 2006-08-21
  • 打赏
  • 举报
回复
更正一下,类型那个地方错了。
表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怎么写?

xzy825 2006-08-21
  • 打赏
  • 举报
回复
除了使用存储过程,用sql写不出来吗?
smilingchen 2006-08-21
  • 打赏
  • 举报
回复
关注
Eric_1999 2006-08-21
  • 打赏
  • 举报
回复
搂主的意思是把三个类型的b2加起来吧??

还要把两列合并吗?说清楚点吧。
utilities 2006-08-21
  • 打赏
  • 举报
回复
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
小李木耳 2006-08-21
  • 打赏
  • 举报
回复
追加:lz不要给我分了!
小李木耳 2006-08-21
  • 打赏
  • 举报
回复
这种要求,写成一个sql真是要命;笨招是建立每种 表A.工资项名称 的子表、每种表B.编号||表B.金额,之后几层嵌套+decode下来;稍微聪明点的就是‘feng2(蜀山风云) ’那种高深的sql了;
建议:后台代码判断,而非sql完成,这么复杂的逻辑分支搞个研究试试还可以,作实际项目有点本本了!
feng2 2006-08-21
  • 打赏
  • 举报
回复
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>
feng2 2006-08-21
  • 打赏
  • 举报
回复
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 所得税-40
dawugui 2006-08-20
  • 打赏
  • 举报
回复
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
dawugui 2006-08-20
  • 打赏
  • 举报
回复
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
wiler 2006-08-20
  • 打赏
  • 举报
回复
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 dual
feng2 2006-08-18
  • 打赏
  • 举报
回复
类别一(00) 类别二 (02) 类别三(03)
----------------------------------------------------------------
基本工资50,饭补50 绩效工资100 所得税-40

这里的类别有些混乱吧?

还有,类别二得到的结果是“奖金100”而不是“绩效工资100”,是么?

要实现这个逻辑,重要的是使用以下2个函数:
sys_connect_by_path()和row_number()over()
剩下的自己做做看。
xzy825 2006-08-18
  • 打赏
  • 举报
回复
楼上的大哥不是把两列连到一起,是把一列中的若干行连到一起。
sxykje 2006-08-18
  • 打赏
  • 举报
回复
column1 || column2连接
加载更多回复(1)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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