SQL Server:分组时发生聚合错误

SQL Server:分组时发生聚合错误,sql,sql-server,group-by,Sql,Sql Server,Group By,我有一个名为tasks的表,其中列出了一个工人可以完成的不同任务。然后,我有一个关系表,它将已完成的任务链接到工作者。 我试图编写一个查询,根据工作人员id将任务分组到一个列表中,但该查询给出了以下错误(见下文) 桌子 CREATE TABLE [dbo].[tasks] ( [task_id] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](50) NOT NULL, [icon] [nvarchar](max) NULL

我有一个名为tasks的表,其中列出了一个工人可以完成的不同任务。然后,我有一个关系表,它将已完成的任务链接到工作者。 我试图编写一个查询,根据工作人员id将任务分组到一个列表中,但该查询给出了以下错误(见下文)

桌子

CREATE TABLE [dbo].[tasks]
(
    [task_id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nvarchar](50) NOT NULL,
    [icon] [nvarchar](max) NULL,
    [isActive] [int] NOT NULL,
    [time] [int] NOT NULL,
    CONSTRAINT [PK_tasks] PRIMARY KEY CLUSTERED 
(
    [task_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]



CREATE TABLE [dbo].[worker_task_completion]
(
    [FK_worker_id] [int] NOT NULL,
    [FK_task_id] [int] NOT NULL,
    [update_date] [datetime] NOT NULL,
    CONSTRAINT [PK_worker_task_completion] PRIMARY KEY CLUSTERED 
(
    [FK_worker_id] ASC,
    [FK_task_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
质疑

SELECT top 100 wtc.FK_worker_id, 
                tasks = Stuff((SELECT ', ' + dbo.tasks.NAME 
                                FROM   dbo.tasks
                               WHERE  dbo.tasks.task_id = 
                                     wtc.FK_task_id
                               FOR xml path ('')), 1, 1, '')
        FROM   dbo.worker_task_completion AS wtc 
                LEFT JOIN dbo.tasks AS tc 
                       ON tc.task_id = wtc.fk_task_id
        -- WHERE  wtc.FK_worker_id IN ()
GROUP  BY wtc.FK_worker_id

Hmmm.您不能对correlation子句使用非聚合列。解决方案是将
连接
移动到子查询中:

SELECT top 100 wtc.FK_worker_id, 
       stuff((SELECT ', ' + t.NAME 
              FROM dbo.worker_task_completion wtc2 JOIN
                   dbo.tasks t
                   ON t.task_id = wtc2.FK_task_id
              WHERE wtc2.FK_worker_id = wtc.FK_worker_id
              FOR xml path ('')
             ), 1, 2, ''
            ) as tasks
FROM (SELECT DISTINCT wtc.FK_worker_id
      FROM dbo.worker_task_completion wtc 
     ) wtc
        -- WHERE  wtc.FK_worker_id IN ()

注意,我更改了
STUFF()
的第二个参数。您可能希望删除空格和逗号。

Hmmm。您不能为correlation子句使用非聚合列。解决方案是将
连接
移动到子查询中:

SELECT top 100 wtc.FK_worker_id, 
       stuff((SELECT ', ' + t.NAME 
              FROM dbo.worker_task_completion wtc2 JOIN
                   dbo.tasks t
                   ON t.task_id = wtc2.FK_task_id
              WHERE wtc2.FK_worker_id = wtc.FK_worker_id
              FOR xml path ('')
             ), 1, 2, ''
            ) as tasks
FROM (SELECT DISTINCT wtc.FK_worker_id
      FROM dbo.worker_task_completion wtc 
     ) wtc
        -- WHERE  wtc.FK_worker_id IN ()
;WITH CTE_worker_task_completion
 AS (SELECT [FK_worker_id]
           ,[FK_task_id]
     FROM [dbo].[worker_task_completion])

 ------------------------------------------
 SELECT [WT].[FK_worker_id]
       ,[Task]=Stuff(
        (
        SELECT ', '+[T].[Name]   
        FROM [dbo].[tasks] AS [T]
        INNER JOIN CTE_worker_task_completion AS [WTC]
              ON [T].[Task_ID]=[WTC].[Task_ID]
      Where [WT].[Worker_ID]=[WTC].[Worker_ID]
        ORDER BY [T].[Name] FOR XML PATH('')
        ),1,1,'')
 FROM CTE_worker_task_completion AS [WT]
 GROUP BY [WT].[FK_worker_id];

注意,我更改了
STUFF()
的第二个参数。您可能希望删除空格和逗号。

您不明白错误是怎么回事吗?问题很清楚。SELECT语句使用了哪些聚合函数?为什么使用
GROUP BY
,而不使用任何聚合函数?我不是在dbo.tasks.NAME列上使用stuff进行聚合吗?不,不是。STUFF/FOR XML路径辅助聚合,但它们不是聚合。您使用的是什么版本的SQL Server?您不明白错误是什么吗?问题很清楚。SELECT语句使用了哪些聚合函数?为什么使用
GROUP BY
,而不使用任何聚合函数?我不是在dbo.tasks.NAME列上使用stuff进行聚合吗?不,不是。STUFF/FOR XML路径辅助聚合,但它们不是聚合。您使用的是什么版本的SQL Server?
;WITH CTE_worker_task_completion
 AS (SELECT [FK_worker_id]
           ,[FK_task_id]
     FROM [dbo].[worker_task_completion])

 ------------------------------------------
 SELECT [WT].[FK_worker_id]
       ,[Task]=Stuff(
        (
        SELECT ', '+[T].[Name]   
        FROM [dbo].[tasks] AS [T]
        INNER JOIN CTE_worker_task_completion AS [WTC]
              ON [T].[Task_ID]=[WTC].[Task_ID]
      Where [WT].[Worker_ID]=[WTC].[Worker_ID]
        ORDER BY [T].[Name] FOR XML PATH('')
        ),1,1,'')
 FROM CTE_worker_task_completion AS [WT]
 GROUP BY [WT].[FK_worker_id];