【问题标题】:SQL Server - Select multiple Columns Group By 1 ColumnSQL Server - 选择多个列按 1 列分组
【发布时间】:2019-06-07 09:29:50
【问题描述】:

我查看了许多选择多列但仅按 1 列分组的示例,而我的似乎给了我重复的结果。见下文我想选择表中的所有列,但只想选择GROUP BYVehicleId。在屏幕截图中,您会看到结果实际上并未按 VehicleId 分组。

知道我做错了什么吗?

尝试1:

SELECT 
    h.*,

    TotalFines = 1,
    TotalIncidents = 1,
    TotalVehicleAllocations = 1,
    TotalVehicleConditions = 1,
    TotalMileageApplications = 1
FROM
(
    SELECT h1.VehicleId FROM [dbo].[VehicleHistory] h1 GROUP BY h1.VehicleId
) GroupedList
INNER JOIN [dbo].[VehicleHistory] h ON GroupedList.VehicleId=h.VehicleId
ORDER BY
    h.VehicleId;

尝试2:

SELECT t1.* FROM VehicleHistory t1
INNER JOIN
(
    SELECT VehicleId FROM VehicleHistory GROUP BY VehicleId
)   t2
ON t1.VehicleId=t2.VehicleId

两个查询产生相同的结果,每个 VehicleId 都有重复的行,如下所示:

下面是我的预期结果。结果是 Entity Framework 生成的查询。但我想将 linq 查询重写为 T-SQL:

【问题讨论】:

  • 你能发布你的预期结果吗?
  • @forpas,我已经添加了结果的样子。我正在尝试将实体框架 Linq 查询重写为 T-SQL 查询...

标签: sql sql-server group-by


【解决方案1】:

这是因为您在子查询中使用 gtouping(与 SELECT DISTINCT h1.VehicleId FROM [dbo].[VehicleHistory] h1 相同):

SELECT h1.VehicleId FROM [dbo].[VehicleHistory] h1 GROUP BY h1.VehicleId

然后您加入该列,这可能会导致出现重复(VehicleHistory 中有重复的 ID)。

您需要做的就是:

SELECT VehicleId,
       MAX(DateUpdated) DateUpdated, --or other aggregate function
       --rest of your columns in appropriate aggreagte functions
FROM VehicleHistory
GROUP BY VehicleId

【讨论】:

  • 是的,这会产生预期的结果,但这是最好的方法,在所有其他列上添加 MAX
  • @Morgs 你可以使用任何你需要的东西,这取决于你,不能被认为是“最佳方法”,因为它取决于。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 2022-10-09
相关资源
最近更新 更多