SQL Sever特殊行转列

asd613613 2014-06-20 12:12:04
表结构如下:
FNumber FSeries  FItemID
M.QZ.AM.TL.00001   内牙  2010
B.QZ.AM.TL.00024   内牙 2010
B.QT.AM.TL.00022   内牙 2010
P.BJ.PL.00008  平螺母 2010
P.CY.QW.00001  球碗 2010
P.CY.QW.00002   球碗 2010
P.CY.SG.00054 内牙 2011
须要进行特殊行转列,如果如下:


内牙 球碗 平螺母 FItemID
M.QZ.AM.TL.00001 P.CY.QW.00001 P.BJ.PL.00008 2010
B.QZ.AM.TL.00024 P.CY.QW.00002 2010
B.QT.AM.TL.00022 2010
P.CY.SG.00054 2011
不知有何种方法可以实现
@DBA_Huangzj 昨天大神给出的方法试了试,自己无法把ID套进去,求解

...全文
811 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
asd613613 2014-06-20
  • 打赏
  • 举报
回复
引用 4 楼 chen357313771 的回复:
pivot max聚合的时候只取最大,给记录加个id,每个id,再max的时候就一条条max,不是一组一组的max了
不过我还有问题想麻烦下你,如果加上一个数量 FNumber FSeries  FItemID 数量 M.QZ.AM.TL.00001   内牙  2010 1 B.QZ.AM.TL.00024   内牙 2010 1 B.QT.AM.TL.00022   内牙 2010 1 P.BJ.PL.00008  平螺母 2010 1 P.CY.QW.00001  球碗 2010 1 P.CY.QW.00002   球碗 2010 1 P.CY.SG.00054 内牙 2011 2 显示效果如下:
内牙              数量    球碗             数量        平螺母        数量    FItemID
----------------  ----    ---------      -------  ----------------   ----    -------
B.QZ.AM.TL.00024    1     P.CY.QW.00002     1       P.BJ.PL.00008     1       2010
B.QT.AM.TL.00022    1     P.CY.QW.00001     1       NULL                      2010
M.QZ.AM.TL.00001    1     NULL                      NULL                      2010
P.CY.SG.00054       2     NULL                      NULL                      2011
我不知要怎么加?
asd613613 2014-06-20
  • 打赏
  • 举报
回复
引用 4 楼 chen357313771 的回复:
pivot max聚合的时候只取最大,给记录加个id,每个id,再max的时候就一条条max,不是一组一组的max了
太感谢你了,写代码还是思路最重要
chen357313771 2014-06-20
  • 打赏
  • 举报
回复
pivot max聚合的时候只取最大,给记录加个id,每个id,再max的时候就一条条max,不是一组一组的max了
asd613613 2014-06-20
  • 打赏
  • 举报
回复
引用 1 楼 chen357313771 的回复:
WITH test(FNumber,FSeries,FItemID)
AS
(
SELECT 'M.QZ.AM.TL.00001',N'内牙','2010' UNION ALL
SELECT 'B.QZ.AM.TL.00024',N'内牙','2010' UNION ALL
SELECT 'B.QT.AM.TL.00022',N'内牙','2010' UNION ALL
SELECT 'P.BJ.PL.00008',N'平螺母','2010' UNION ALL
SELECT 'P.CY.QW.00001',N'球碗','2010' UNION ALL
SELECT 'P.CY.QW.00002',N'球碗','2010' UNION ALL
SELECT 'P.CY.SG.00054',N'内牙','2011'
)
,test1 AS 
(
	SELECT ROW_NUMBER() OVER(PARTITION BY FSeries ORDER BY GETDATE()) AS ID
		,* 
	FROM test
)
--SELECT * FROM test1
SELECT [内牙],[球碗],[平螺母],FItemID
FROM test1 AS A
PIVOT (MAX(FNumber) FOR FSeries IN([内牙],[球碗],[平螺母]))p
可以帮我解释一下具体的思路不/?
asd613613 2014-06-20
  • 打赏
  • 举报
回复
非常感谢~你
chen357313771 2014-06-20
  • 打赏
  • 举报
回复
WITH test(FNumber,FSeries,FItemID)
AS
(
SELECT 'M.QZ.AM.TL.00001',N'内牙','2010' UNION ALL
SELECT 'B.QZ.AM.TL.00024',N'内牙','2010' UNION ALL
SELECT 'B.QT.AM.TL.00022',N'内牙','2010' UNION ALL
SELECT 'P.BJ.PL.00008',N'平螺母','2010' UNION ALL
SELECT 'P.CY.QW.00001',N'球碗','2010' UNION ALL
SELECT 'P.CY.QW.00002',N'球碗','2010' UNION ALL
SELECT 'P.CY.SG.00054',N'内牙','2011'
)
,test1 AS 
(
	SELECT ROW_NUMBER() OVER(PARTITION BY FSeries ORDER BY GETDATE()) AS ID
		,* 
	FROM test
)
--SELECT * FROM test1
SELECT [内牙],[球碗],[平螺母],FItemID
FROM test1 AS A
PIVOT (MAX(FNumber) FOR FSeries IN([内牙],[球碗],[平螺母]))p

22,300

社区成员

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

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