Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当我不使用';我不想使用聚合?_Sql_Sql Server_Sql Server 2008_Tsql_Pivot Without Aggregate - Fatal编程技术网

Sql 当我不使用';我不想使用聚合?

Sql 当我不使用';我不想使用聚合?,sql,sql-server,sql-server-2008,tsql,pivot-without-aggregate,Sql,Sql Server,Sql Server 2008,Tsql,Pivot Without Aggregate,我正在尝试处理如何将表数据转换成更具视觉吸引力的格式以供输出。这可能是问题的一部分,因为我想要的可能是用于单独的报告软件 我有一张像这样的桌子 teacher student ---------------------- teacher1 Bob teacher1 Jim teacher2 Sam teacher3 Bill teacher3 John teacher3 Eric 我想要一张像这样的桌子: teacher1 teacher2 teach

我正在尝试处理如何将表数据转换成更具视觉吸引力的格式以供输出。这可能是问题的一部分,因为我想要的可能是用于单独的报告软件

我有一张像这样的桌子

teacher    student
----------------------
teacher1   Bob
teacher1   Jim
teacher2   Sam
teacher3   Bill
teacher3   John
teacher3   Eric
我想要一张像这样的桌子:

teacher1    teacher2    teacher3
---------------------------------
Bob         Sam          Bill
Jim         null         John
null        null         Eric
DECLARE @teacherList AS VARCHAR(max)

SELECT @teacherList = Stuff((SELECT DISTINCT',[' + teacher + ']'
                              FROM myTable
                              FOR xml path('')), 1, 1, '')

DECLARE @dynamic_pivot_query AS VARCHAR(max)

SET @dynamic_pivot_query = 'select' + @teacherList + 
'from 
(
    SELECT [teacher],[student]
    FROM [dbo].[myTable]
) as S
Pivot
(
    MIN([student])
    FOR teacher IN (' + @teacherList + ')
) as P
'
EXEC(@dynamic_pivot_query)  
因此,我尝试将所有教师姓名填充到一个变量中,然后使用一个
Pivot
,但由于我必须选择一个聚合,因此我只能得到
Max
Min
学生,如下所示:

teacher1    teacher2    teacher3
---------------------------------
Bob         Sam          Bill
Jim         null         John
null        null         Eric
DECLARE @teacherList AS VARCHAR(max)

SELECT @teacherList = Stuff((SELECT DISTINCT',[' + teacher + ']'
                              FROM myTable
                              FOR xml path('')), 1, 1, '')

DECLARE @dynamic_pivot_query AS VARCHAR(max)

SET @dynamic_pivot_query = 'select' + @teacherList + 
'from 
(
    SELECT [teacher],[student]
    FROM [dbo].[myTable]
) as S
Pivot
(
    MIN([student])
    FOR teacher IN (' + @teacherList + ')
) as P
'
EXEC(@dynamic_pivot_query)  
其结果是:

teacher1    teacher2    teacher3
---------------------------------
Bob         Sam          Bill
假设:

  • #教师人数及其姓名未知(变量)
  • #每位教师的学生人数未知,而且每位教师的人数可能不同
  • 有办法做到这一点吗?

    没有

    SQL Server需要静态类型。无法创建动态列数或动态列类型(sql_变体除外)

    因此,您的动态SQL解决方案是唯一可能的选择

    不要让最小值/最大值让您感到困惑:每个聚合始终有0或1个项目。语法要求理论正确性的聚合,但如果(教师、学生)是唯一的,则聚合不起任何作用。它不会造成伤害,也不会改变结果


    这种方法正是正确的。实际上,我现在正在处理同一类型的代码(这很有趣)。

    您可以使用
    行数
    获得您想要的结果

    SET @dynamic_pivot_query = 'select ' + @teacherList + 
    'from 
    (
        SELECT [teacher],[student], row_number() over(partition by teacher order by student) as rn
        FROM [dbo].[myTable]
    ) as S
    Pivot
    (
        MIN([student])
        FOR teacher IN (' + @teacherList + ')
    ) as P
    '
    
    更新:
    要删除SQL注入漏洞,应使用
    quotename
    正确引用字段列表

    SELECT @teacherList = Stuff((SELECT DISTINCT',' + quotename(teacher)
                                  FROM myTable
                                  FOR xml path('')), 1, 1, '') 
    

    你最好也希望小鲍比·泰尔斯(Bobby Tables)没有长大成为一名教师。这很容易受到SQL注入的攻击。@SteveKass-谢谢你指出这一点。我已经更新了答案。