一道SQL题,不知如何解,请教高手解答,在线等待(100分)

  • 主题发起人 主题发起人 xbeing
  • 开始时间 开始时间
X

xbeing

Unregistered / Unconfirmed
GUEST, unregistred user!
一个表:tab_detail中有:
d_masterno 主键
.......
.....
.....
另外一个表:tab_detail_child中:
d_masterno 主键1
dc_itemname 主键2
dc_text

现在有如下问题:
如何取得如下结果;
d_masterno no1 no2 no3
........................................
........................................
........................................
其中no1列内容为当dc_itemname = 'no1'时的dc_text值
其中no2列内容为当dc_itemname = 'no2'时的dc_text值
其中no2列内容为当dc_itemname = 'no2'时的dc_text值


 
写的具体一点,把内容告诉我。
我不是高手不过乐于为小弟看看!
 
用case 語句可以實現
select d_masterno,(case dc_itemname='n01' then dc_text end) as no1,
(case dc_itemname='n02' then dc_text end) as no2,
(case dc_itemname='n03' then dc_text end) as no3
from tab_detail_child
where condition
............
這隻是提示你的,語法是不對的,不知你的dc_text是什麼類型的
 
SELECT d_masterno,
(CASE DC_ITEMNAME WHEN 'NO1' THEN DC_TEXT ELSE '' END) AS NO1,
(CASE DC_ITEMNAME WHEN 'NO2' THEN DC_TEXT ELSE '' END) AS NO2,
(CASE DC_ITEMNAME WHEN 'NO3' THEN DC_TEXT ELSE '' END) AS NO3
FROM tab_detail_child
 
是以SQL sever 还是 oracle ?

关注,有意思的一道题。
 
1.数据库:oracle?mssql?
2.dc_text的数据类型
 
可能只能用临时表或内存表来实现
INSERT INTO TMP (d_masterno,no1)
SELECT d_masterno,dc_text FROM tab_detail_child
WHERE dc_itemname = 'no1'

UPDATE TMP SET tmp.no2=tab_detail_child.dc_text
WHERE (tmp.dc_itemname=tab_detail_child.dc_itemname)
AND(dc_itemname.dc_itemname='no2')
...
如果是 ACCESS或SQL SERVER 可以用VIEW。
 
lb_icesea79的思路是正确的。不过应该修正一下。

SELECT tab_detail.d_masterno,
(CASE DC_ITEMNAME WHEN 'NO1' THEN DC_TEXT ELSE '' END) AS NO1,
(CASE DC_ITEMNAME WHEN 'NO2' THEN DC_TEXT ELSE '' END) AS NO2,
(CASE DC_ITEMNAME WHEN 'NO3' THEN DC_TEXT ELSE '' END) AS NO3
FROM tab_detail, tab_detail_child
where tab_detail.d_masterno = tab_detail_child.d_masterno
 
dc_text为text类型,用的数据库为sql_server2000
我是这样的:
select d_masterno,max(case when dc_itemname ='no1' then convert(varchar,dc_text) else '' end) no1,
max(case when dc_itemname ='no2' then convert(varchar,dc_text) else '' end) no2,
max(case when dc_itemname ='no3' then convert(varchar,dc_text) else '' end) no3
from tab_detail_child
where d_masterno = :d_masterno
group by d_masterno

不过在进行转换时有数据丢失,请教还有什么办法实现呢?
 
select d_masterno,
max(case dc_itemname when 'no1' then dc_text else '' end) no1,
max(case dc_itemname when 'no2' then dc_text else '' end) no2,
max(case dc_itemname when 'no3' then dc_text else '' end) no3
from tab_detail_child
group by d_masterno

试试,应该可以的
 
不行的,text类型不能用聚合函数,只能转换为其它类型才可以的。
 
select d_masterno,max(case when dc_itemname ='no1' then convert(varchar,dc_text) else '' end) no1,
max(case when dc_itemname ='no2' then convert(varchar,dc_text) else '' end) no2,
max(case when dc_itemname ='no3' then convert(varchar,dc_text) else '' end) no3
from tab_detail_child
where d_masterno = :d_masterno
group by d_masterno
如果你要传d_masterno 就不用加它了
select (case when dc_itemname ='no1' then convert(varchar,dc_text) else '' end) no1,
(case when dc_itemname ='no2' then convert(varchar,dc_text) else '' end) no2,
(case when dc_itemname ='no3' then convert(varchar,dc_text) else '' end) no3
from tab_detail_child
where d_masterno = :d_masterno
再不行的话写个函数,返回结果
create function string(@d_masterno int,@dc_itemname varchar)
returns varchar(2000)
as
declare @return varchar(2000)
begin
select @return=convert(varchar,dc_text) from tablemname where d_masterno=@d_masterno
and dc_itemname=@dc_itemname
return(@return)
end
select d_masterno,string(d_masterno,'no1'),string(d_masterno,'no2'),string(d_masterno,'no3'),
from tab_detail_child
where d_masterno=:d_masterno


 
这样的问题为何不说清楚是什么后台数据库,不同的数据库有不同的解决方法
 
请问如果是ORACLE怎么解决!!!
 
多人接受答案了。
 
后退
顶部