交叉表动态列

create table #test(name  nvarchar(20),type  nvarchar(20),category  nvarchar(20))
--select * from #test
insert into #test(name,type,category) values ('n1','t1','c1');
insert into #test(name,type,category) values ('n1','t1','c1');
insert into #test(name,type,category) values ('n2','t2','c1');
insert into #test(name,type,category) values ('n3','t3','c3');
insert into #test(name,type,category) values ('n3','t3','c4');
insert into #test(name,type,category) values ('n4','t4','c5');
insert into #test(name,type,category) values ('n1','t1','c1');


--type固定
select category,name,sum(case when type='t1' then 1 else 0 end) as 't1',sum(case when type='t2' then 1 else 0 end) as 't2',sum(case when type='t3' then 1 else 0 end) as 't3' from #test group by name,category
--如果type不固定
--使用动态SQL语句   交叉表
Declare @SQL Varchar(8000)
Select @SQL = 'select category, name'
Select @SQL = @SQL + ', SUM(case when type= ''' + type + ''' Then 1 Else 0 End) As ' + type
from #TEST Group By type
select @SQL = @SQL + ' from #TEST group by category, name Order By category, name'
print @SQL
EXEC(@SQL)
drop table #test
GO
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 SQL Server 中,您可以使用 PIVOT 运算符来执行动态交叉。下面是使用 PIVOT 运算符编写的示例查询,该查询将 dbo_产品加工费用 中的数据转换为动态交叉: ``` SELECT * FROM ( SELECT 产品编号, 岗位, 加工费 FROM dbo_产品加工费用 WHERE 启用否 = 1 ) AS 原始数据 PIVOT ( AVG(加工费) FOR 岗位 IN ([岗位1], [岗位2], [岗位3]) -- 根据实际需求修改岗位名 ) AS 动态交叉 ``` 在上面的查询中,我们使用了子查询来获取原始数据,并且使用 PIVOT 运算符将原始数据转换为动态交叉。在 PIVOT 运算符中,我们使用了 AVG 聚合函数来计算加工费之平均值,并且使用 FOR 关键字指定了岗位名。 请注意,PIVOT 运算符要求您在查询中指定所有可能的值。如果您的数据中岗位的值是不确定的,您可以使用动态 SQL 来生成查询,如下所示: ``` DECLARE @sql AS NVARCHAR(MAX) DECLARE @pivot_cols AS NVARCHAR(MAX) -- 生成动态 SQL SELECT @pivot_cols = COALESCE(@pivot_cols + ', ', '') + QUOTENAME(岗位) FROM dbo_产品加工费用 WHERE 启用否 = 1 SET @sql = ' SELECT * FROM ( SELECT 产品编号, 岗位, 加工费 FROM dbo_产品加工费用 WHERE 启用否 = 1 ) AS 原始数据 PIVOT ( AVG(加工费) FOR 岗位 IN (' + @pivot_cols + ') ) AS 动态交叉 ' -- 执行动态 SQL EXEC sp_executesql @sql ``` 在上面的代码中,我们首先使用 COALESCE 函数和 QUOTENAME 函数来生成动态 SQL 中的,然后将其插入到查询字符串中。最后,我们使用 sp_executesql 存储过程来执行动态 SQL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值