sql语句,求大神帮忙

smilyvm 2017-06-14 01:53:37
主从表,FID关联
主表内容:
FID FNAME HOUDU MENDIAN
1 H123 1.2 AB
2 H278 1.2 IJ

从表内容
FID FTYPE ALIAS(别名) FPRICE(单价)
1 箱包 K186 24
1 鞋材 H123 27
2 箱包 H278 32

查询结果

FID FNAME HOUDU 箱包 鞋材 箱包单价 鞋材单价
1 H123 1.2 K186 H123 24 27
2 H278 1.2 H278 32
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
smilyvm 2017-06-14
  • 打赏
  • 举报
回复
谢谢各位,类型不多,应该静态的就可以了,
shinger126 2017-06-14
  • 打赏
  • 举报
回复
如果是静态的,并且从表的FTYPE类型是有限的几个,建议用主表关联多次从表来实现
二月十六 2017-06-14
  • 打赏
  • 举报
回复
引用 3 楼 zhouyuehai1978 的回复:
感觉楼主其实是想要动态列吧。。。


动态的也可以:
--测试数据
if not object_id(N'Tempdb..#Main') is null
drop table #Main
Go
Create table #Main([FID] int,[FNAME] nvarchar(24),[HOUDU] decimal(18,7),[MENDIAN] nvarchar(22))
Insert #Main
select 1,N'H123',1.2,N'AB' union all
select 2,N'H278',1.2,N'IJ'
GO
if not object_id(N'Tempdb..#Detail') is null
drop table #Detail
Go
Create table #Detail([FID] int,[FTYPE] nvarchar(22),[ALIAS] nvarchar(24),[FPRICE] int)
Insert #Detail
select 1,N'箱包',N'K186',24 union all
select 1,N'鞋材',N'H123',27 union all
select 2,N'箱包',N'H278',32 union all
select 2,N'测试类型',N'H278',10032
Go
--测试数据结束
DECLARE @sql1 VARCHAR(8000)
SET @sql1 = 'select a.FID ,a.FNAME ,a.HOUDU'
SELECT @sql1 = @sql1 + ' , max(case FTYPE when ''' + RTRIM(b.FTYPE)
+ ''' then ALIAS else null end) [' + RTRIM(FTYPE)+ ']'
FROM (SELECT DISTINCT FTYPE FROM #Detail) b

SELECT @sql1 = @sql1 + ' , max(case FTYPE when ''' + RTRIM(b.FTYPE)
+ ''' then FPRICE else null end) [' + RTRIM(FTYPE)+'单价' + ']'
FROM (SELECT DISTINCT FTYPE FROM #Detail) b
SET @sql1 = @sql1 + ' from #Main a
JOIN #Detail b ON b.FID = a.FID
GROUP BY a.FID ,
a.FNAME ,
a.HOUDU'
EXEC( @sql1 )


顺势而为1 2017-06-14
  • 打赏
  • 举报
回复
引用 3 楼 zhouyuehai1978 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#Main') is null
	drop table #Main
Go
Create table #Main([FID] int,[FNAME] nvarchar(24),[HOUDU] decimal(18,7),[MENDIAN] nvarchar(22))
Insert #Main
select 1,N'H123',1.2,N'AB' union all
select 2,N'H278',1.2,N'IJ'
GO
if not object_id(N'Tempdb..#Detail') is null
	drop table #Detail
Go
Create table #Detail([FID] int,[FTYPE] nvarchar(22),[ALIAS] nvarchar(24),[FPRICE] int)
Insert #Detail
select 1,N'箱包',N'K186',24 union all
select 1,N'鞋材',N'H123',27 union all
select 2,N'箱包',N'H278',32
Go
--测试数据结束
SELECT  a.FID ,
        a.FNAME ,
        a.HOUDU ,
        MAX(CASE WHEN b.FTYPE = '箱包' THEN ALIAS
                 ELSE NULL 
            END) AS 箱包 ,
        MAX(CASE WHEN b.FTYPE = '鞋材' THEN ALIAS
                 ELSE NULL
            END) AS 鞋材 ,
        MAX(CASE WHEN b.FTYPE = '箱包' THEN FPRICE
                 ELSE NULL
            END) AS 箱包单价,
        MAX(CASE WHEN b.FTYPE = '鞋材' THEN FPRICE
                 ELSE NULL
            END) AS 鞋材单价
FROM    #Main a
        JOIN #Detail b ON b.FID = a.FID
		GROUP BY a.FID ,
        a.FNAME ,
        a.HOUDU
感觉楼主其实是想要动态列吧。。。[/quote] 这里楼主的意思只有4列,
zhouyuehai1978 2017-06-14
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#Main') is null
	drop table #Main
Go
Create table #Main([FID] int,[FNAME] nvarchar(24),[HOUDU] decimal(18,7),[MENDIAN] nvarchar(22))
Insert #Main
select 1,N'H123',1.2,N'AB' union all
select 2,N'H278',1.2,N'IJ'
GO
if not object_id(N'Tempdb..#Detail') is null
	drop table #Detail
Go
Create table #Detail([FID] int,[FTYPE] nvarchar(22),[ALIAS] nvarchar(24),[FPRICE] int)
Insert #Detail
select 1,N'箱包',N'K186',24 union all
select 1,N'鞋材',N'H123',27 union all
select 2,N'箱包',N'H278',32
Go
--测试数据结束
SELECT  a.FID ,
        a.FNAME ,
        a.HOUDU ,
        MAX(CASE WHEN b.FTYPE = '箱包' THEN ALIAS
                 ELSE NULL 
            END) AS 箱包 ,
        MAX(CASE WHEN b.FTYPE = '鞋材' THEN ALIAS
                 ELSE NULL
            END) AS 鞋材 ,
        MAX(CASE WHEN b.FTYPE = '箱包' THEN FPRICE
                 ELSE NULL
            END) AS 箱包单价,
        MAX(CASE WHEN b.FTYPE = '鞋材' THEN FPRICE
                 ELSE NULL
            END) AS 鞋材单价
FROM    #Main a
        JOIN #Detail b ON b.FID = a.FID
		GROUP BY a.FID ,
        a.FNAME ,
        a.HOUDU
感觉楼主其实是想要动态列吧。。。
顺势而为1 2017-06-14
  • 打赏
  • 举报
回复


if not object_id(N'Tempdb..#Tmp_M') is null
    drop table #Tmp_M
Go

create table #Tmp_M
(
	FID int,
	FNAME  varchar(10),
	HOUDU	decimal(13,2),
	MENDIAN	varchar(10)
)

insert into #Tmp_M
select  1,'H123',1.2,'AB' union
Select 2,'H278',1.2,'IJ'

if not object_id(N'Tempdb..#Tmp_D') is null
    drop table #Tmp_D
Go

create table #Tmp_D
(
	FID int,
	FTYPE  nvarchar(10),
	AIALS  varchar(10),
	FPRICE int
)

insert into #Tmp_D
select 1,N'箱包','K186',24 union
select 1,N'鞋材','K123',27 union
select 2,N'箱包','K278',32 


Alter Table #Tmp_M Add 箱包 varchar(10)
Alter Table #Tmp_M Add 鞋材 varchar(10)
Alter Table #Tmp_M Add 箱包单价 int 
Alter Table #Tmp_M Add 鞋材单价 int 

UPDATE #Tmp_M
SET 箱包=AIALS,箱包单价=FPrice
From #Tmp_M a 
Join #Tmp_D b on a.Fid=b.Fid
Where FTYPE=N'箱包'

UPDATE #Tmp_M
SET 鞋材=AIALS,鞋材单价=Fprice
From #Tmp_M a 
Join #Tmp_D b on a.Fid=b.Fid
Where FTYPE=N'鞋材'



二月十六 2017-06-14
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#Main') is null
drop table #Main
Go
Create table #Main([FID] int,[FNAME] nvarchar(24),[HOUDU] decimal(18,7),[MENDIAN] nvarchar(22))
Insert #Main
select 1,N'H123',1.2,N'AB' union all
select 2,N'H278',1.2,N'IJ'
GO
if not object_id(N'Tempdb..#Detail') is null
drop table #Detail
Go
Create table #Detail([FID] int,[FTYPE] nvarchar(22),[ALIAS] nvarchar(24),[FPRICE] int)
Insert #Detail
select 1,N'箱包',N'K186',24 union all
select 1,N'鞋材',N'H123',27 union all
select 2,N'箱包',N'H278',32
Go
--测试数据结束
SELECT a.FID ,
a.FNAME ,
a.HOUDU ,
MAX(CASE WHEN b.FTYPE = '箱包' THEN ALIAS
ELSE NULL
END) AS 箱包 ,
MAX(CASE WHEN b.FTYPE = '鞋材' THEN ALIAS
ELSE NULL
END) AS 鞋材 ,
MAX(CASE WHEN b.FTYPE = '箱包' THEN FPRICE
ELSE NULL
END) AS 箱包单价,
MAX(CASE WHEN b.FTYPE = '鞋材' THEN FPRICE
ELSE NULL
END) AS 鞋材单价
FROM #Main a
JOIN #Detail b ON b.FID = a.FID
GROUP BY a.FID ,
a.FNAME ,
a.HOUDU


22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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