如何实现行转列

淡淡的风8620 2018-08-06 02:15:00
有库存表A
id 商品id 商品名称 库存数量
1 01 可乐 120
2 03 雪碧 48

计量单位表B
商品id 单位名称 单位类型 换算率
01 瓶 基础单位 1
01 箱 辅助单位 12
03 瓶 基础单位 1
03 箱 辅助单位 24
想得到一下结果表C
商品id 商品名称 库存数量 基础单位 基础单位数量 辅助单位 辅助单位数量
01 可乐 120 瓶 120 箱 10
03 雪碧 240 瓶 48 箱 2

搞了半天,搞不定,哪位高手给写下sql语句:
...全文
238 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
引用 13 楼 cc001100 的回复:
不错,还可以,晚上回家弄项目上试试。谢谢大家,谢谢二十六。顺便问一句,分没了,可以买吗

https://bbs.csdn.net/help#common_problem
淡淡的风8620 2018-08-06
  • 打赏
  • 举报
回复
不错,还可以,晚上回家弄项目上试试。谢谢大家,谢谢二十六。顺便问一句,分没了,可以买吗
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([id] int,[商品id] nvarchar(22),[商品名称] nvarchar(22),[库存数量] int)
Insert #A
select 1,N'01',N'可乐',120 union all
select 2,N'03',N'雪碧',48
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([商品id] nvarchar(22),[单位名称] nvarchar(21),[单位类型] nvarchar(24),[换算率] int)
Insert #B
select N'01',N'瓶',N'基础单位',1 union all
select N'01',N'箱',N'辅助单位',12 union all
select N'03',N'瓶',N'基础单位',1 union all
select N'03',N'箱',N'辅助单位',24 union all
select N'03',N'大箱',N'辅助单位',48
Go
--测试数据结束
DECLARE @sql VARCHAR(MAX)
SET @sql = ';WITH cte AS (
SELECT #A.*,#B.单位名称,#B.单位类型,#B.换算率,#B.单位类型+RTRIM(ROW_NUMBER()OVER(PARTITION BY #B.商品id,#B.单位类型 ORDER BY GETDATE())) AS 类型 FROM #B JOIN #A on #B.商品id = #A.商品id
)
select 商品id,商品名称,库存数量'
;WITH cte AS (
SELECT *,单位类型+RTRIM(ROW_NUMBER()OVER(PARTITION BY 商品id,单位类型 ORDER BY GETDATE())) AS 类型 FROM #B
)
SELECT @sql = @sql + ',max(case 类型 when ''' + 类型
+ ''' then 单位名称 else null end)[' + 类型 + '],max(case 类型 when ''' + 类型
+ ''' then 库存数量/换算率 else null end)[' + 类型 + '数量]'
FROM ( SELECT DISTINCT
类型
FROM cte
) a
SET @sql = @sql
+ ' from cte group by 商品id,商品名称,库存数量'
EXEC(@sql)



淡淡的风8620 2018-08-06
  • 打赏
  • 举报
回复
也有可能只有1个,大多数是1个或者2个,3个,四个的比较少见,数量不确定呢
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
引用 8 楼 cc001100 的回复:
[quote=引用 7 楼 sinat_28984567 的回复:]
[quote=引用 6 楼 cc001100 的回复:]

如果是这样的话
是下面的这种结果


我希望是在右边多一列更好,这样多一行,不是我要的结果,麻烦各位大神再给看看

所以最开始问你是不是固定的两个……现在是3个了[/quote]

我理解错你的意思了,我以为问这个名称是否是固定的呢
[/quote]
那就是多少个不固定?
淡淡的风8620 2018-08-06
  • 打赏
  • 举报
回复
是不固定个数的,一般来说,辅助单位也就最多四五个,能实现吗
淡淡的风8620 2018-08-06
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
[quote=引用 6 楼 cc001100 的回复:]

如果是这样的话
是下面的这种结果


我希望是在右边多一列更好,这样多一行,不是我要的结果,麻烦各位大神再给看看

所以最开始问你是不是固定的两个……现在是3个了[/quote]

我理解错你的意思了,我以为问这个名称是否是固定的呢
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
引用 6 楼 cc001100 的回复:

如果是这样的话
是下面的这种结果


我希望是在右边多一列更好,这样多一行,不是我要的结果,麻烦各位大神再给看看

所以最开始问你是不是固定的两个……现在是3个了
淡淡的风8620 2018-08-06
  • 打赏
  • 举报
回复

如果是这样的话
是下面的这种结果


我希望是在右边多一列更好,这样多一行,不是我要的结果,麻烦各位大神再给看看

淡淡的风8620 2018-08-06
  • 打赏
  • 举报
回复
非常感谢,我去试试哈
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([id] int,[商品id] nvarchar(22),[商品名称] nvarchar(22),[库存数量] int)
Insert #A
select 1,N'01',N'可乐',120 union all
select 2,N'03',N'雪碧',48
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([商品id] nvarchar(22),[单位名称] nvarchar(21),[单位类型] nvarchar(24),[换算率] int)
Insert #B
select N'01',N'瓶',N'基础单位',1 union all
select N'01',N'箱',N'辅助单位',12 union all
select N'03',N'瓶',N'基础单位',1 union all
select N'03',N'箱',N'辅助单位',24
Go
--测试数据结束
SELECT
#A.商品id,
商品名称,
库存数量,
b1.单位名称 AS 基础单位,
库存数量 / b1.换算率 AS 基础单位数量,
b2.单位名称 AS 辅助单位,
库存数量 / b2.换算率 AS 辅助单位数量
FROM
#A
LEFT JOIN
#B b1
ON b1.商品id = #A.商品id
AND b1.单位类型 = '基础单位'
LEFT JOIN
#B b2
ON b2.商品id = #A.商品id
AND b2.单位类型 = '辅助单位';


吉普赛的歌 版主 2018-08-06
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('storeA') IS NOT NULL DROP TABLE storeA;
IF OBJECT_ID('unitB') IS NOT NULL DROP TABLE unitB;
GO
CREATE TABLE storeA(
id INT PRIMARY KEY,
productId VARCHAR(10),
productName NVARCHAR(10),
storeNum INT
)
GO
CREATE TABLE unitB(
productId VARCHAR(10),
unitName NVARCHAR(10),
unitType NVARCHAR(10),
convertRate INT
)
GO
INSERT INTO storeA(id,productId,productName,storeNum) VALUES(1,'01','可乐',120)
INSERT INTO storeA(id,productId,productName,storeNum) VALUES(2,'03','雪碧',48)
GO
INSERT INTO unitB(productId,unitName,unitType,convertRate) VALUES ('01','瓶','基础单位','1');
INSERT INTO unitB(productId,unitName,unitType,convertRate) VALUES ('01','箱','辅助单位','12');
INSERT INTO unitB(productId,unitName,unitType,convertRate) VALUES ('03','瓶','基础单位','1');
INSERT INTO unitB(productId,unitName,unitType,convertRate) VALUES ('03','箱','辅助单位','24');
GO
SELECT
a.productId AS [商品id]
,a.productName AS [商品名称]
,a.storeNum AS [库存数量]
,(SELECT TOP 1 b.unitName FROM unitB AS b WHERE a.productId=b.productId AND b.unitType='基础单位') AS [基础单位]
,a.storeNum AS [基础单位数量]
,(SELECT TOP 1 b.unitName FROM unitB AS b WHERE a.productId=b.productId AND b.unitType='辅助单位') AS [辅助单位]
,a.storeNum/(SELECT TOP 1 b.convertRate FROM unitB AS b WHERE a.productId=b.productId AND b.unitType='辅助单位') AS [辅助单位数量]
FROM storeA AS a


淡淡的风8620 2018-08-06
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
基础单位和辅助单位都是两个固定吗?



引用 1 楼 sinat_28984567 的回复:
基础单位和辅助单位都是两个固定吗?
s

引用 1 楼 sinat_28984567 的回复:
基础单位和辅助单位都是两个固定吗?
是固定的
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
基础单位和辅助单位都是两个固定吗?

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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