【问题标题】:GROUP BY T1.* ? Group by all columns in Table1, joined left by table 2, and Aggregate functions on T2 columns?按 T​​1.* 分组?按表 1 中的所有列分组,按表 2 左连接,以及 T2 列上的聚合函数?
【发布时间】:2020-04-27 07:52:37
【问题描述】:

我有一个合并 2 个表的查询。表 1 有很多列,并且最终可能会扩展。表 2 也有几列,但我将对其 90% 的列执行聚合函数。表 1 有 300 + 行,表 2 有 84K + 行。

SELECT 
     t1.*
    ,t2.c2
    ,SUM(t2.c3)
    ,SUM(t2.c4)
FROM 
    Table1 AS t1 
    LEFT JOIN Table2 AS t2 ON t1.c10 = t2.c1
GROUP BY 
     t1.* 
    ,t2.c2

我收到一个错误Incorrect Syntax near '*',它指向包含GROUP BY 语句的行。

我知道SELECT t1.* 在尝试聚合 T2 列之前运行此部分时工作正常,并且按预期工作。

有没有办法快速GROUP BY T1 中的所有列?我知道通常我们只会选择需要的列,但在这种情况下,我需要所有 T1 列。

以前的研究使我只找到使用 1 个表的实例,并且大多数人都希望获取或删除重复值。我希望专门将 T1 的 300 条记录与 T2 的 84K 记录结合起来,而不必在 GROUP BY 部分中命名 T1 中的所有列。

【问题讨论】:

  • 你看过这个答案了吗:dba.stackexchange.com/questions/21226/…
  • 我没有看过那篇文章。这有助于降低行数,但我仍然在 70K 左右,并且 T1 数据仍在重复。
  • 我会推荐GROUPING SETS,但它们不能应用于您的情况,因为您参考了第二个表格的一列。
  • 实际上,@wosi 的答案对我有用。我在加入表格时获得 70K 行的原因是因为我需要将它们加入 2 列而不是 1 列。感谢大家的帮助。

标签: sql-server ssms-2016


【解决方案1】:

您不能在GroupBy 语句中使用*。当然,有一些Dynamic SQL 可以防止在SP 中输入所有列,但是如果您使用T-SQL inview,则应该输入所有columns

【讨论】:

  • 如果我可以在 select 中使用 *,是否可以将 t1.* 分配给变量?这行得通吗?
  • 不,您不能将 * 分配给任何系统数据类型变量或用户定义的表类型。只要一列在 * 中,您就可以将 * 分配给变量。
  • 不是我正在寻找的答案,但感谢您提供更多信息。我会知道以供将来参考。
【解决方案2】:

这个方法有点不合常规,但是你可以通过动态sql把它传入一个变量中。下面是一个示例,说明如何做到这一点:

declare @test nvarchar(max)
set @test = ''
select @test += Column_name +',' from information_schema.columns where table_name='Table1'
DECLARE @sql nvarchar(max)
SELECT @sql = N'SELECT top 10 ' +@test+ 'NULL as a FROM Table1;'
EXEC sp_executesql @sql

您可以应用相同的原则并重写您的查询以使用 group by 函数。希望这会有所帮助。

【讨论】:

    【解决方案3】:

    根据@wosi https://dba.stackexchange.com/questions/21226/why-do-wildcards-in-group-by-statements-not-work 发布的文章,我能够修改代码并获得预期的结果。请注意,我从 80K 变为 70K,因为我加入了 1 列的表格。我的数据结构方式必须加入 2 列。最终代码如下所示:

    SELECT
         t1.*
        ,t2.c2
        ,t2.c3
        ,t2.c4
    FROM
        Table1 AS t1
        LEFT JOIN
            (SELECT c2, SUM(c3), SUM(c4)
             FROM Table2
             GROUP BY c2) AS t2
            ON t1.c10 = t2.c1 AND t1.c15 = t2.c2
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多