我正在处理一组数据,如下所示。
StudentName | AssignmentName |成绩- StudentA |工作分配1| 100 StudentA |工作分配2| 80 StudentA |总计| 180 StudentB |工作分配1| 100 StudentB |工作分配2| 80 StudentB |工作分配3| 100 StudentB |总计| 280
分配的名称和数量是动态的,我需要获得类似于以下内容的结果。
学生|作业1|作业2|作业3|
学生A总数| 100 | 80 |空| 180学生B| 100| 80 | 100 | 280
现在,理想情况下,我希望根据“到期日”对列进行排序,该“到期日”可以包含/关联到每个作业。如果可能,总数应该在末尾(如果可能,可以计算它并将其从查询中删除)。
我知道如何使用pivot简单地命名列来完成这3个任务,它试图以一种动态的方式来完成它,但我还没有找到一个好的解决方案。我正尝试在SQL Server 2005上执行此操作
编辑
理想情况下,我希望在不使用动态SQL的情况下实现这一点,因为这是违反策略的。如果不是possible...then,那么使用Dynamic SQL的工作示例就可以了。
发布于 2008-10-17 21:05:11
我知道你说没有动态SQL
,但我看不到在直接的SQL
中有任何方法可以做到这一点。
如果你看看我在Pivot Table and Concatenate Columns和PIVOT in sql 2005上对类似问题的回答
那里的动态SQL
不容易受到注入的攻击,也没有充分的理由禁止它。另一种可能性(如果数据很少更改)是代码生成,而不是动态SQL
,而是定期向存储过程生成SQL
。
发布于 2012-12-21 22:33:11
要使用动态sql对此数据执行PIVOT
操作,您可以在SQL Server 2005+中使用以下代码:
创建表:
CREATE TABLE yourtable
([StudentName] varchar(8), [AssignmentName] varchar(12), [Grade] int)
;
INSERT INTO yourtable
([StudentName], [AssignmentName], [Grade])
VALUES
('StudentA', 'Assignment 1', 100),
('StudentA', 'Assignment 2', 80),
('StudentA', 'Total', 180),
('StudentB', 'Assignment 1', 100),
('StudentB', 'Assignment 2', 80),
('StudentB', 'Assignment 3', 100),
('StudentB', 'Total', 280)
;
Dynamic PIVOT:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(AssignmentName)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT StudentName, ' + @cols + ' from
(
select StudentName, AssignmentName, grade
from yourtable
) x
pivot
(
min(grade)
for assignmentname in (' + @cols + ')
) p '
execute(@query)
结果是:
| STUDENTNAME | ASSIGNMENT 1 | ASSIGNMENT 2 | ASSIGNMENT 3 | TOTAL |
--------------------------------------------------------------------
| StudentA | 100 | 80 | (null) | 180 |
| StudentB | 100 | 80 | 100 | 280 |
发布于 2008-10-17 20:24:39
我找到的唯一方法就是使用动态SQL并将列标签放入一个变量中。
https://stackoverflow.com/questions/213702
复制相似问题