请教一个横纵表

iamsilly 2018-03-17 06:17:07
原表如下

insert into ta
select '001', 'A1','10毫米','条','20180106','001','材料仓1',100
union all
select '001','A1','10毫米', '条','20180106','001','材料仓2',200
union all
select '001','A1','10毫米', '条','20180106','001','材料仓3',300
union all
select '001','A1','10毫米', '条','20180208','001','材料仓1',100
union all
select '001','A1','10毫米', '条','20180208','001','材料仓2' ,200
union all
select '002','A2','20毫米', '颗','T-1', '001','材料仓1',100
union all
select '002','A2','20毫米', '颗','T-2', '001','材料仓2',200
union all
select '002','A2','20毫米', '颗','T-3', '001','材料仓3',300
要求得到的结果是

说明:物料编码+批号+仓库代码是不会重复的(物料编码,物料名称,规格型号是同一个东西)
...全文
529 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2018-03-23
  • 打赏
  • 举报
回复
引用 6 楼 iamsilly 的回复:
[quote=引用 5 楼 RINK_1 的回复:]

create table #ta 
(item_code varchar(10),
 item_name varchar(10),
 item_type nvarchar(20),
 unit_type nvarchar(10),
 bat_no varchar(20),
 warehouse_id varchar(10),
 warehouse_name nvarchar(20),
 qty int)
 
insert into #ta  
select '001', 'A1','10毫米','条','20180106','001','材料仓1',100
union all
select '001','A1','10毫米',	'条','20180106','001','材料仓2',200
union all
select '001','A1','10毫米',	'条','20180106','001','材料仓3',300
union all
select '001','A1','10毫米',	'条','20180208','001','材料仓1',100
union all
select '001','A1','10毫米',	'条','20180208','001','材料仓2'	,200
union all
select '002','A2','20毫米',	'颗','T-1',	'001','材料仓1',100
union all
select '002','A2','20毫米',	'颗','T-2',	'001','材料仓2',200
union all
select '002','A2','20毫米',	'颗','T-3',	'001','材料仓3',300

declare @str nvarchar(1000)

select @str=ISNULL(@str+',','')+QUOTENAME(warehouse_name,'[') from (select distinct warehouse_name from #ta) as A

print @str

declare @sql nvarchar(2000)

set @sql='select * from (select bat_no,item_code,item_name,item_type,unit_type,warehouse_name,qty from #ta) A 
          pivot (sum(qty) for warehouse_name in('+@str+')) B'
          
exec(@sql)

我将语句修改为我自己的表后,发现 print @sql 后,将下面的这句拷贝在查询分析器是正常的。 select * from (select FBatchNo,物料编码,物料名称,FBUUnitName,FStockName,FBUQty from hs_ReturnInventory) A pivot (sum(FBUQty) for FStockName in([客供料仓],[良品仓],[清洗不良品仓],[清洗良品仓])) B 但是如果直接 exec @sql 就报下面的错误 消息 203,级别 16,状态 2,第 7 行 名称 'select * from (select FBatchNo,物料编码,物料名称,FBUUnitName,FStockName,FBUQty from hs_ReturnInventory) A pivot (sum(FBUQty) for FStockName in([客供料仓],[良品仓],[清洗不良品仓],[清洗良品仓])) B' 不是有效的标识符。 [/quote] 是 EXEC (@SQL),不是EXEC @SQL,别漏了括号。
iamsilly 2018-03-23
  • 打赏
  • 举报
回复
引用 5 楼 RINK_1 的回复:

create table #ta 
(item_code varchar(10),
 item_name varchar(10),
 item_type nvarchar(20),
 unit_type nvarchar(10),
 bat_no varchar(20),
 warehouse_id varchar(10),
 warehouse_name nvarchar(20),
 qty int)
 
insert into #ta  
select '001', 'A1','10毫米','条','20180106','001','材料仓1',100
union all
select '001','A1','10毫米',	'条','20180106','001','材料仓2',200
union all
select '001','A1','10毫米',	'条','20180106','001','材料仓3',300
union all
select '001','A1','10毫米',	'条','20180208','001','材料仓1',100
union all
select '001','A1','10毫米',	'条','20180208','001','材料仓2'	,200
union all
select '002','A2','20毫米',	'颗','T-1',	'001','材料仓1',100
union all
select '002','A2','20毫米',	'颗','T-2',	'001','材料仓2',200
union all
select '002','A2','20毫米',	'颗','T-3',	'001','材料仓3',300

declare @str nvarchar(1000)

select @str=ISNULL(@str+',','')+QUOTENAME(warehouse_name,'[') from (select distinct warehouse_name from #ta) as A

print @str

declare @sql nvarchar(2000)

set @sql='select * from (select bat_no,item_code,item_name,item_type,unit_type,warehouse_name,qty from #ta) A 
          pivot (sum(qty) for warehouse_name in('+@str+')) B'
          
exec(@sql)

我将语句修改为我自己的表后,发现 print @sql 后,将下面的这句拷贝在查询分析器是正常的。 select * from (select FBatchNo,物料编码,物料名称,FBUUnitName,FStockName,FBUQty from hs_ReturnInventory) A pivot (sum(FBUQty) for FStockName in([客供料仓],[良品仓],[清洗不良品仓],[清洗良品仓])) B 但是如果直接 exec @sql 就报下面的错误 消息 203,级别 16,状态 2,第 7 行 名称 'select * from (select FBatchNo,物料编码,物料名称,FBUUnitName,FStockName,FBUQty from hs_ReturnInventory) A pivot (sum(FBUQty) for FStockName in([客供料仓],[良品仓],[清洗不良品仓],[清洗良品仓])) B' 不是有效的标识符。
中国风 2018-03-19
  • 打赏
  • 举报
回复
参照:行列互转_整理贴 https://bbs.csdn.net/topics/240002706
zjcxc 元老 2018-03-19
  • 打赏
  • 举报
回复
WITH DATA(物料编码,物料名称,规格型号,单位名称,批号,仓库代码,仓库名称,数量) AS(
select '001', 'A1','10毫米','条','20180106','001','材料仓1',100
union all
select '001','A1','10毫米', '条','20180106','001','材料仓2',200
union all
select '001','A1','10毫米', '条','20180106','001','材料仓3',300
union all
select '001','A1','10毫米', '条','20180208','001','材料仓1',100
union all
select '001','A1','10毫米', '条','20180208','001','材料仓2' ,200
union all
select '002','A2','20毫米', '颗','T-1', '001','材料仓1',100
union all
select '002','A2','20毫米', '颗','T-2', '001','材料仓2',200
union all
select '002','A2','20毫米', '颗','T-3', '001','材料仓3',300
)
SELECT * FROM(
		SELECT 批号,物料编码,物料名称,规格型号,单位名称,数量,仓库名称 FROM DATA
	) PDATA
	PIVOT( SUM(数量) FOR 仓库名称 IN(材料仓1,材料仓2,材料仓3) )P
RINK_1 2018-03-19
  • 打赏
  • 举报
回复

create table #ta 
(item_code varchar(10),
 item_name varchar(10),
 item_type nvarchar(20),
 unit_type nvarchar(10),
 bat_no varchar(20),
 warehouse_id varchar(10),
 warehouse_name nvarchar(20),
 qty int)
 
insert into #ta  
select '001', 'A1','10毫米','条','20180106','001','材料仓1',100
union all
select '001','A1','10毫米',	'条','20180106','001','材料仓2',200
union all
select '001','A1','10毫米',	'条','20180106','001','材料仓3',300
union all
select '001','A1','10毫米',	'条','20180208','001','材料仓1',100
union all
select '001','A1','10毫米',	'条','20180208','001','材料仓2'	,200
union all
select '002','A2','20毫米',	'颗','T-1',	'001','材料仓1',100
union all
select '002','A2','20毫米',	'颗','T-2',	'001','材料仓2',200
union all
select '002','A2','20毫米',	'颗','T-3',	'001','材料仓3',300

declare @str nvarchar(1000)

select @str=ISNULL(@str+',','')+QUOTENAME(warehouse_name,'[') from (select distinct warehouse_name from #ta) as A

print @str

declare @sql nvarchar(2000)

set @sql='select * from (select bat_no,item_code,item_name,item_type,unit_type,warehouse_name,qty from #ta) A 
          pivot (sum(qty) for warehouse_name in('+@str+')) B'
          
exec(@sql)

iamsilly 2018-03-19
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
WITH DATA(物料编码,物料名称,规格型号,单位名称,批号,仓库代码,仓库名称,数量) AS(
select '001', 'A1','10毫米','条','20180106','001','材料仓1',100
union all
select '001','A1','10毫米', '条','20180106','001','材料仓2',200
union all
select '001','A1','10毫米', '条','20180106','001','材料仓3',300
union all
select '001','A1','10毫米', '条','20180208','001','材料仓1',100
union all
select '001','A1','10毫米', '条','20180208','001','材料仓2' ,200
union all
select '002','A2','20毫米', '颗','T-1', '001','材料仓1',100
union all
select '002','A2','20毫米', '颗','T-2', '001','材料仓2',200
union all
select '002','A2','20毫米', '颗','T-3', '001','材料仓3',300
)
SELECT * FROM(
		SELECT 批号,物料编码,物料名称,规格型号,单位名称,数量,仓库名称 FROM DATA
	) PDATA
	PIVOT( SUM(数量) FOR 仓库名称 IN(材料仓1,材料仓2,材料仓3) )P
仓库都是动态的哟
iamsilly 2018-03-18
  • 打赏
  • 举报
回复
我这个横纵表跟其他横纵表不一样,多了一个维度,所以有点难度。

34,588

社区成员

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

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