T-SQL中带有PIVOT命令的GROUPBY语句

T-SQL中带有PIVOT命令的GROUPBY语句,sql,sql-server,tsql,group-by,pivot,Sql,Sql Server,Tsql,Group By,Pivot,我有一个SQL查询,它涉及一个PIVOT命令,该命令创建正确的表,但现在我需要按其中一列进行分组 尝试添加GROUP BY语句时,它返回以下错误:“数据透视表.1”列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中 SELECT [Load ID],[1],[2],[3],[4] FROM TMS_Load_Stops PIVOT ( MIN([Stop Zip]) for [Sequence] IN ([1],[2],[3],[4]) )

我有一个SQL查询,它涉及一个PIVOT命令,该命令创建正确的表,但现在我需要按其中一列进行分组

尝试添加GROUP BY语句时,它返回以下错误:“数据透视表.1”列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中

SELECT [Load ID],[1],[2],[3],[4]
FROM TMS_Load_Stops
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable
;
原始代码产生以下结果:

为了便于解释,我希望结果如下:数值是随机数:

如果省略Group by子句,它会自动将[Load ID]作为分组列。轴心有三种类型的列:分组列、聚合列和生成列。这里的分组是[Load ID],跨越是[Sequence],聚合是[Stop Zip]。 使用下面的查询

SELECT [Load ID],[1],[2],[3],[4]
FROM TMS_Load_Stops
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable

如果省略Group by子句,它会自动将[Load ID]作为分组列。轴心有三种类型的列:分组列、聚合列和生成列。这里的分组是[Load ID],跨越是[Sequence],聚合是[Stop Zip]。 使用下面的查询

SELECT [Load ID],[1],[2],[3],[4]
FROM TMS_Load_Stops
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable

使用条件聚合。这要简单得多:

SELECT [Load ID],
       MIN(CASE WHEN [Sequence] = 1 THEN [Stop Zip] END) as [1],
       MIN(CASE WHEN [Sequence] = 2 THEN [Stop Zip] END) as [2],
       MIN(CASE WHEN [Sequence] = 3 THEN [Stop Zip] END) as [3],
       MIN(CASE WHEN [Sequence] = 4 THEN [Stop Zip] END) as [4],
FROM TMS_Load_Stops
GROUP BY [Load ID];
透视无效,因为正在透视的表中有其他列。我只是不喜欢语法或它的工作方式,但您也可以通过只选择所需的列来修复它:

SELECT [Load ID], [1], [2], [3], [4]
FROM (SELECT [Load ID], [Sequence], [Stop Zip]
      FROM TMS_Load_Stops
     ) ls
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable
;

使用条件聚合。这要简单得多:

SELECT [Load ID],
       MIN(CASE WHEN [Sequence] = 1 THEN [Stop Zip] END) as [1],
       MIN(CASE WHEN [Sequence] = 2 THEN [Stop Zip] END) as [2],
       MIN(CASE WHEN [Sequence] = 3 THEN [Stop Zip] END) as [3],
       MIN(CASE WHEN [Sequence] = 4 THEN [Stop Zip] END) as [4],
FROM TMS_Load_Stops
GROUP BY [Load ID];
透视无效,因为正在透视的表中有其他列。我只是不喜欢语法或它的工作方式,但您也可以通过只选择所需的列来修复它:

SELECT [Load ID], [1], [2], [3], [4]
FROM (SELECT [Load ID], [Sequence], [Stop Zip]
      FROM TMS_Load_Stops
     ) ls
PIVOT (
    MIN([Stop Zip])
    for [Sequence] IN ([1],[2],[3],[4])
    ) PivotTable
;

您必须在数据透视之前投影掉TMS_Load_中的任何附加列,因为它已经使用数据透视中未提及的所有列执行分组:


您必须在数据透视之前投影掉TMS_Load_中的任何附加列,因为它已经使用数据透视中未提及的所有列执行分组:


你想在这里做什么?编辑问题,添加一些样本数据和期望的结果会很有帮助。你不能只按一列分组。也许是一个独特的?也许是完全不同的东西?我猜这里的方法不太正确。但是,如果没有样本数据和所需的输出,这只是猜测。您在这里尝试做什么?编辑问题添加一些样本数据和所需的结果将很有帮助。您不能仅按一列进行分组。也许是一个独特的?也许是完全不同的东西?我猜这里的方法不太正确。但是没有样本数据和期望的输出,这只是猜测。谢谢!结果正是我想要的谢谢!结果正是我想要的