SQL Server行转换

asd613613 2014-06-19 09:53:46
现有表c:结构
FNumber , FISeries
Nvarchar(50) Nvarchar(50)
数据为:
P.BJ.CX.00003 插销
P.BJ.KC.00006 开槽螺母
P.BJ.YZ.00001 油嘴
P.XJ.FT.00019 防尘套
P.SL.FC.00001 防尘罩
P.BJ.PL.00008 平螺母
P.CY.QW.00001 球碗
P.CY.QW.00002 球碗
P.KH.TD.00011 弹垫
P.CY.SG.00054 上盖
B.QZ.AM.TL.00024 内牙
B.QT.AM.TL.00022 内牙
M.QT.AM.BJ.00281 拨叉
M.QZ.AM.TL.00001 内牙
须要进行 行转列操作得到如下结果:

开槽螺母 油嘴 防尘套 防尘罩 内牙
P.BJ.YZ.00001 P.XJ.FT.00019 P.SL.FC.00001 M.QZ.AM.TL.00001 P.CY.QW.00001
\ \ \ \ B.QZ.AM.TL.00024
\ \ \ \ B.QT.AM.TL.00022
请问有没有办法实现这样的行转列?
...全文
268 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
asd613613 2014-06-19
  • 打赏
  • 举报
回复
好得,非常感谢,我来试试 ~
發糞塗牆 2014-06-19
  • 打赏
  • 举报
回复
如果能估算,就这样写,不过不能估算的话我也不知道怎么搞,可能需要前端来协助实现。
----------------------------------------------------------------
-- Author  :DBA_HuangZJ(发粪涂墙)
-- Date    :2014-06-19 10:44:04
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
--	Apr  2 2010 15:48:46 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([FNumber] nvarchar(32),[FISeries] nvarchar(6))
insert [huang]
select 'M.QZ.AM.TL.00001',N'内牙' union all
select 'B.QZ.AM.TL.00024',N'内牙' union all
select 'B.QT.AM.TL.00022',N'内牙' union all
select 'P.BJ.PL.00008',N'平螺母' union all
select 'P.CY.QW.00001',N'球碗' union all
select 'P.CY.QW.00002',N'球碗'
--------------生成数据--------------------------



SELECT ISNULL([内牙],'\')[内牙],ISNULL([平螺母],'\')[平螺母]
FROM 
(SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())id, fnumber AS N'内牙'
FROM huang 
WHERE [FISeries]=N'内牙')a full JOIN (SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())id, fnumber AS N'平螺母'
FROM huang 
WHERE [FISeries]=N'平螺母') b ON a.id=b.id



----------------结果----------------------------
/* 
内牙                               平螺母
-------------------------------- --------------------------------
M.QZ.AM.TL.00001                 P.BJ.PL.00008
B.QZ.AM.TL.00024                 \
B.QT.AM.TL.00022                 \

*/
动态的话我只能做到这里:
----------------------------------------------------------------
-- Author  :DBA_HuangZJ(发粪涂墙)
-- Date    :2014-06-19 10:44:04
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
--	Apr  2 2010 15:48:46 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([FNumber] nvarchar(32),[FISeries] nvarchar(6))
insert [huang]
select 'M.QZ.AM.TL.00001',N'内牙' union all
select 'B.QZ.AM.TL.00024',N'内牙' union all
select 'B.QT.AM.TL.00022',N'内牙' union all
select 'P.BJ.PL.00008',N'平螺母' union all
select 'P.CY.QW.00001',N'球碗' union all
select 'P.CY.QW.00002',N'球碗'
--------------生成数据--------------------------





declare @s nvarchar(4000)
set @s=''
Select     @s=@s+','+quotename([FISeries])+'=(case when [FISeries]=N'+quotename([FISeries],'''')+' then FNumber else  ''\''  end)'
from [huang] group by [FISeries]
SET @s=SUBSTRING(@s,2,LEN(@s))

exec('select '+@s+' from [huang] ')




----------------结果----------------------------
/* 
内牙                               平螺母                              球碗
-------------------------------- -------------------------------- --------------------------------
M.QZ.AM.TL.00001                 \                                \
B.QZ.AM.TL.00024                 \                                \
B.QT.AM.TL.00022                 \                                \
\                                P.BJ.PL.00008                    \
\                                \                                P.CY.QW.00001
\                                \                                P.CY.QW.00002

*/
asd613613 2014-06-19
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
你的种类会不会很多啊?或者无法预估?
嗯,对有很多~不知有多少个
發糞塗牆 2014-06-19
  • 打赏
  • 举报
回复
你的种类会不会很多啊?或者无法预估?
asd613613 2014-06-19
  • 打赏
  • 举报
回复
引用 7 楼 DBA_Huangzj 的回复:
你这种展现方式好像不能用行转列
如果不能用行转列的话请告诉我应该怎么做?用哪种方式比较好
發糞塗牆 2014-06-19
  • 打赏
  • 举报
回复
你这种展现方式好像不能用行转列
asd613613 2014-06-19
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
可以参考一下:http://www.cnblogs.com/gaizai/p/3753296.html
数据: M.QZ.AM.TL.00001 内牙 B.QZ.AM.TL.00024 内牙 B.QT.AM.TL.00022 内牙 P.BJ.PL.00008 平螺母 P.CY.QW.00001 球碗 P.CY.QW.00002 球碗 结果: 内牙 平螺母 球碗 M.QZ.AM.TL.00001 P.BJ.PL.00008 P.CY.QW.00001 B.QZ.AM.TL.00024 P.CY.QW.00002 B.QT.AM.TL.00022 刚刚各位大大给的代码我都看了,好像不可以实现这样的行列列,请问还有别的方法没?
asd613613 2014-06-19
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
可以参考一下:http://www.cnblogs.com/gaizai/p/3753296.html
感谢
發糞塗牆 2014-06-19
  • 打赏
  • 举报
回复
asd613613 2014-06-19
  • 打赏
  • 举报
回复
引用 1 楼 fredrickhu 的回复:
http://bbs.csdn.net/topics/240002706 实在是不想写了
我还是有个问题。。上面例子内牙有两个。。如果照您给我的这个方法那么就只有一行了, 我希望继续添加到下一行
asd613613 2014-06-19
  • 打赏
  • 举报
回复
引用 1 楼 fredrickhu 的回复:
http://bbs.csdn.net/topics/240002706 实在是不想写了
非常感谢我, 来看看
--小F-- 2014-06-19
  • 打赏
  • 举报
回复

22,207

社区成员

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

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