首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server 2005透视表的列数未知

SQL Server 2005透视表的列数未知
EN

Stack Overflow用户
提问于 2008-10-17 20:19:57
回答 7查看 49.1K关注 0票数 23

我正在处理一组数据,如下所示。

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的工作示例就可以了。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-10-17 21:05:11

我知道你说没有动态SQL,但我看不到在直接的SQL中有任何方法可以做到这一点。

如果你看看我在Pivot Table and Concatenate ColumnsPIVOT in sql 2005上对类似问题的回答

那里的动态SQL不容易受到注入的攻击,也没有充分的理由禁止它。另一种可能性(如果数据很少更改)是代码生成,而不是动态SQL,而是定期向存储过程生成SQL

票数 12
EN

Stack Overflow用户

发布于 2012-12-21 22:33:11

要使用动态sql对此数据执行PIVOT操作,您可以在SQL Server 2005+中使用以下代码:

创建表:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)

请参阅SQL Fiddle with Demo

结果是:

代码语言:javascript
复制
| STUDENTNAME | ASSIGNMENT 1 | ASSIGNMENT 2 | ASSIGNMENT 3 | TOTAL |
--------------------------------------------------------------------
|    StudentA |          100 |           80 |       (null) |   180 |
|    StudentB |          100 |           80 |          100 |   280 |
票数 9
EN

Stack Overflow用户

发布于 2008-10-17 20:24:39

我找到的唯一方法就是使用动态SQL并将列标签放入一个变量中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/213702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档