我在用VB6.0+SQL SERVER2008做相应的程序,其中用到动态交叉表,我在用ACCESS2007做相应的交叉表SQL语句是 “TRANSFORM Avg(dbo_产品加工费用表.加工费) AS 加工费之平均值 SELECT dbo_产品加工费用表.产品编号 FROM dbo_产品加工费用表 WHERE (((dbo_产品加工费用表.启用否)=True)) GROUP BY dbo_产品加工费用表.产品编号 PIVOT dbo_产品加工费用表.岗位;“ 但SERVER2008不支持TRANSFORM,请详细说明一下,我如何转换成SQL SERVER2008的动态交叉表的SQL语句?提醒:其中“dbo_产品加工费用表.岗位”字段会根据不同的需求有不同的变化
时间: 2024-03-22 15:41:39 浏览: 48
在 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。
阅读全文