日期:2014-05-17  浏览次数:20789 次

关于数据库查询的问题
有几条这样的数据,

id , date , shop , y_com , total

1 01 北京 运输公司1 4
2 01 北京 运输公司2 5
3 01 北京 运输公司3 6
4 01 北京 运输公司1 7
5 01 北京 运输公司1 8
6 01 北京 运输公司1 9
7 01 北京 运输公司1 10

查询出来以后成一条这样的数据
  
1 01 北京 运输公司1 (台数38) 运输公司2 (台数5) 运输公司3 (台数6)

不知道sql语句能不能做出来,用存储过程也可以,注意台数能自动累加哦!

------解决方案--------------------
SQL code
--测试数据
create table test1(id int,cdate varchar2(2),shop varchar2(100), y_com varchar2(100),    total int);

insert into test1
select 1,'01','北京','运输公司1',4 from dual union all
select 2,'01','北京','运输公司2',5 from dual union all
select 3,'01','北京','运输公司3',6 from dual union all
select 4,'01','北京','运输公司1',7 from dual union all
select 5,'01','北京','运输公司1',8 from dual union all
select 6,'01','北京','运输公司1',9 from dual union all
select 7,'01','北京','运输公司1',10  from dual;


--行列转换
create or replace procedure getRstData( rst out sys_refcursor)
is
begin
declare
cursor cur is select y_com,sum(total) s
from test1 
group by cdate,shop,y_com;

t1 varchar2(100);
t2 varchar2(100);
str varchar2(4000);
begin
str:='select cdate,shop';
open cur;
loop
fetch cur into t1,t2;
exit when cur%notfound;
str:=str||','''||t1||''',''(台数'||t2||')''';
end loop;
str:=str||' from test1 group by cdate,shop';
--dbms_output.put_line(str);
close cur;
open rst for str;
end;
end;


--输出结果
1    01    北京    运输公司1    (台数38)    运输公司2    (台数5)    运输公司3    (台数6)

------解决方案--------------------
SELECT DATE1,SHOP,'运输公司1 (台数'||SUM(CASE WHEN Y_COM='运输公司1'
THEN TOTAL ELSE 0 END)||')' 运输公司1,
'运输公司2 (台数'||SUM(CASE WHEN Y_COM='运输公司2'
THEN TOTAL ELSE 0 END)||')' 运输公司2,
'运输公司3 (台数'||SUM(CASE WHEN Y_COM='运输公司3'
THEN TOTAL ELSE 0 END)||')' 运输公司3 
FROM A GROUP BY DATE1,SHOP

--
DATE1 SHOP 运输公司1 运输公司2 运输公司3
1 01 北京 运输公司1 (台数38) 运输公司2 (台数5) 运输公司3 (台数6)