sql中一對多關係的查詢結果的多行轉換成一行多列

時間 2021-10-14 22:25:42

1樓:匿名使用者

1、建立測試表,

create table test_fee(userid number, feeid number, fee number);

2、插入測試資料

insert into test_fee values(1,1001,80);

insert into test_fee values(1,1002,70);

insert into test_fee values(1,1003,90);

insert into test_fee values(1,1004,60);

insert into test_fee values(2,1001,99);

insert into test_fee values(2,1002,66);

insert into test_fee values(2,1001,55);

3、查詢表中所有記錄,select t.*, rowid from test_fee t,

4、編寫sql,按userid彙總,根據不同的feeid,進行行轉列彙總,

select userid,

sum(case when feeid = 1001 then fee else 0 end) as fee_1001,

sum(case when feeid = 1002 then fee else 0 end) as fee_1002,

sum(case when feeid = 1003 then fee else 0 end) as fee_1003,

sum(case when feeid = 1004 then fee else 0 end) as fee_1004

from test_fee t

group by userid

2樓:匿名使用者

--用動態sql實現行轉列。因用到了row_number,只適用於sql server 2005及以上版本

--測試資料

with

[user](id,name,roleid)

as(select 1,'bobo','r1' union all

select 2,'coco','r1' union all

select 3,'dodo','r1' union all

select 4,'eoeo','r2' union all

select 5,'fofo','r2'),

[role](id,name)

as(select 'r1','admin' union all

select 'r2','user')

--兩表聯合查詢後暫存入臨時表

select b.id roleid,b.name rolename,a.

name username,row_number() over (partition by b.id order by a.id) seq

into #t

from [user] a

inner join [role] b on a.roleid=b.id;

--拼接動態sql

declare @sql varchar(max);

set @sql='';

select @sql=@sql+

',max(case seq when '+cast(tt.seq as varchar)+' then username else '''' end) user'+cast(tt.seq as varchar)

from (select distinct seq from #t) tt

order by seq;

set @sql='select rolename'+@sql+' from #t group by roleid,rolename';

--列印動態sql

select @sql;

--執行動態sql

exec(@sql);

--刪除臨時表

drop table #t;

生成的動態sql為:

select rolename,

max(case seq when 1 then username else '' end) user1,

max(case seq when 2 then username else '' end) user2,

max(case seq when 3 then username else '' end) user3

from #t group by roleid,rolename

最終查詢結果為:

3樓:若水大大

select role.name, user.name from role left join [user] on role.id = user.roleid;

4樓:收費一

select 需要的列 form role a

left join user b on a.id = b.roleid

5樓:匿名使用者

這個需求好奇怪呀.

-------------------

如果有sql能寫出來你需要的那樣查詢結果, 那不是在向r1新增一條記錄就有1列了呀.這樣查出來怎麼在程式層面取值啊.

-----------------

我感覺 應該是你吧需求理解錯了吧

access一對多行,查詢時實現一行多列,sql語句怎麼寫

6樓:匿名使用者

select 員工表.姓名,

max(switch(考勤表.日期='週一',出勤,true,'')) as 週一,

max(switch(考勤表.日期='週二',出勤,true,'')) as 週二,

max(switch(考勤表.日期='週三',出勤,true,'')) as 週三,

max(switch(考勤表.日期='週四',出勤,true,'')) as 週四,

max(switch(考勤表.日期='週五',出勤,true,'')) as 週五

from 員工表,考勤表 where 員工表.id=考勤表.員工id

group by 員工表.姓名

7樓:節子不哭

標準的sql語法可以這麼寫,思想上是一樣的,實現上有點出入可以自己改一改,我覺得這樣查詢效率低了好多,為什麼要這樣的結果呢,

select e.name,

(select a.attendace from  attendance_table a where a.id =e.

id and a.week ='monday') monday,

(select a.attendace from  attendance_table a where a.id =e.

id and a.week ='tuesday') tuesday,

(select a.attendace from  attendance_table a where a.id =e.

id and a.week ='wednesday') wednesday,

(select a.attendace from  attendance_table a where a.id =e.

id and a.week ='thursday') thursday,

.........

from employee_table e

8樓:匿名使用者

--因為姓名可能重複,所以不建議用姓名分組,而用id分組

select max(t1.姓名) as 姓名,max(iif(t2.日期='週一',t2.出勤,' ')) as 週一

,max(iif(t2.日期='週二',t2.出勤,' ')) as 週二

,max(iif(t2.日期='週三',t2.出勤,' ')) as 週三

,max(iif(t2.日期='週四',t2.出勤,' ')) as 週四

,max(iif(t2.日期='週五',t2.出勤,' ')) as 週五 from

員工表 t1 left join 考勤表 t2 on t1.id=t2.員工id

group by t1.id

9樓:匿名使用者

其實你可以考慮用transform語句,簡潔多了

sql資料庫一對多關係如何取出多條資料? 10

10樓:匿名使用者

直接在sql中是沒法這麼個結構出來的,需要配合程式語言實現

1、先查詢出使用者列表,然後迴圈使用者列表,再根據使用者跟作品表的關聯查詢到每個使用者的作品資訊

2、分別查詢出使用者表和作品表中的所有資料,再根據使用者和作品的關聯欄位進行資料的組合

11樓:匿名使用者

select * from

(select

--t.id,

t.bigclass,

t.num,

t.smallclass,

t.[content],

t.isquantization,

--t.deptid,

--t.targetvalue,

--t.minvalue,

--t.strivevalue,

--t.score,

--t.belongtoperiod,

--t.quantizationtype,--t.indicatorsepdept,--t.f_createdate,

--t.[status]

dzir.*

,row=row_number() over(partition by t.id order by dzir.createtime desc)

from

dk_zb_deptindicator as tright join

dk_zb_indicatorreport as dzir on dzir.indicatorsid = t.id)   as t where  t.row = 1

dk_zb_deptindicator 對應你的  user 表

dk_zb_indicatorreport 對應你的 作品表

12樓:節子不哭

不是很明白你具體需要做什麼,**有一對多的關係,取出什麼樣的資料?

13樓:匿名使用者

select * from user left join works on users.id = works.userid group by users.姓名

求一條sql語句,一對多關係拆分多條顯示。

14樓:

select userid,to_char( wm_concat(jobid)) from a group by userid order by userid

Access兩個表一對多關係如何實現查詢

小開文件鋪 select name,學科,學科成績 from 學生表,成績表where 學生表.name 成績表.name 學生表.name 和 成績表.name 做成一對多的關係,使用上述查詢就可以了。此外,不建議用name作聯絡欄位,最好用一個id欄位,因為name可能會重複。有問題可以找我 t...

在vf中,建立一對多關係和永久關係,怎麼判斷是建立主索引

情聖 右擊修改 索引 就可以看啦 主索引 普通索引或者是候選索引 普通索引 沒有什麼大不了的事 主索引是指關鍵字或索引表示式中不允許出現重複值的索引,主索引用於主表或被引用的表,用來在一個永久關係中建立參照完整性。對於一個表而言,只能建立一個主索引。候選索引是可以做主關鍵字的索引,因為它不允許含nu...

SQL如何顯示查詢結果的前100條

橄欖樹島嶼 sql語句顯示查詢結果前100條在不同的資料庫查詢語句不同,分別是 1 在 sqlserver資料庫中 set rowcount 100 goselect from 表名 2 在oracle資料庫中 select from 表名 where rownum 100 3 在mysql資料庫中...