T-SQL中带有PIVOT命令的GROUPBY语句
我有一个SQL查询,它涉及一个PIVOT命令,该命令创建正确的表,但现在我需要按其中一列进行分组 尝试添加GROUP BY语句时,它返回以下错误:“数据透视表.1”列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中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]) )
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_中的任何附加列,因为它已经使用数据透视中未提及的所有列执行分组:
你想在这里做什么?编辑问题,添加一些样本数据和期望的结果会很有帮助。你不能只按一列分组。也许是一个独特的?也许是完全不同的东西?我猜这里的方法不太正确。但是,如果没有样本数据和所需的输出,这只是猜测。您在这里尝试做什么?编辑问题添加一些样本数据和所需的结果将很有帮助。您不能仅按一列进行分组。也许是一个独特的?也许是完全不同的东西?我猜这里的方法不太正确。但是没有样本数据和期望的输出,这只是猜测。谢谢!结果正是我想要的谢谢!结果正是我想要的