【问题标题】:How do I rewrite my SQL query to remove redundant values from a GROUP BY column?如何重写我的 SQL 查询以从 GROUP BY 列中删除冗余值?
【发布时间】:2014-10-05 13:57:43
【问题描述】:

我正在开展一个项目,旨在提供一个系统,您可以在其中分析 SQL 表中的数据。我正在做这个查询(在 VB.NET 程序中)将所需的数据放入 GridView:

SELECT [task], [activity], SUM([consumption]) AS TotalMin 
FROM [TimeTable]
WHERE [name]=@name 
   AND [month]=@month 
   AND [year]=@year 
GROUP BY [task], [activity]
ORDER BY [task] ASC

我得到的是这样的:

task        | activity | TotalMin
------------+----------+---------
new website | meeting  | 60
new website | planing  | 240
new website | testing  | 340
new app     | meeting  | 60
new app     | planing  | 240
new app     | testing  | 340 

是否有可能不为每个活动重复任务,所以它只显示一次任务,然后只显示与下面列出的该任务相关的每个活动?

想要的输出是:

task        | activity | TotalMin
------------+----------+---------
new website | meeting  | 60
            | planing  | 240
            | testing  | 340
new app     | meeting  | 60
            | planing  | 240
            | testing  | 340 

【问题讨论】:

  • 您使用过(除其他外)vb.net 标签。该编程语言与您的问题有什么关系?您在这里只发布了一个 SQL 查询……?
  • 正如原帖中提到的那样,select语句用于用vb.net组件的数据填充GridView。
  • 是的,但似乎 VB.NET,也不是 GridView,实际上与您的问题无关。您的问题是关于如何更改查询以便获得不同的结果。你能举个例子来说明你想要的结果吗?
  • 你是对的。感谢您的反馈:) 我已经用所需的输出更新了帖子:)

标签: sql sql-server select group-by distinct


【解决方案1】:

您可以在查询中尝试这样的操作:

SELECT CASE WHEN ROW_NUMBER() OVER (PARTITION BY [task] ORDER BY [task]) = 1 THEN [task] ELSE '' END as [task],
 [activity], SUM([consumption]) AS TotalMin 
FROM [TimeTable]
WHERE [name]=@name 
   AND [month]=@month 
   AND [year]=@year 
GROUP BY [task], [activity]
ORDER BY [task] ASC

此查询使用ROW_NUMBER() 函数将相关任务分组在一起,并为每个任务分配一个连续的行号。并且仅显示第 1 行的实际任务

【讨论】:

  • 感谢您的回答。这通过删除 ORDER BY 语句来工作:)
  • @RomanParhiz,如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您找到了解决方案,并为回答者和您自己赢得了一些声誉。
  • @AHiggins 完成!感谢我得到的所有帮助:)
【解决方案2】:

如果您要将网格绑定到 DataTable,这是给我的要求,我可能会在绑定之前修改 DataTable 的内容。

在 VB.NET 中遍历行集合非常简单...

For Each r As DataRow in MyDataTable.Rows()

在循环中,您将任务名称与上一行的任务名称进行比较。如果与上一行相同,则将其更改为空字符串。

请注意,这是一种蛮力破解,并且可能有一种更优雅的方式来实现预期目标。然而,优雅并不总是最好的,蛮力并不总是最差的。 :)

【讨论】:

  • 感谢您的回答。你是绝对正确的。但在此之前,我想知道是否可以单独使用 SQL。
  • 哦,我确信仅通过 SQL 是可能的,但是没有--正确-- 解决这个问题的方法。使用满足您的需求和应用程序需求的任何解决方案。此外,如果您使用蛮力方法,请在代码中保留一些 cmets,以便下一个开发人员知道您做了什么以及为什么。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多