【问题标题】:MSSQL query issue - putting alias name in GROUP BY part of the queryMSSQL 查询问题 - 将别名放在查询的 GROUP BY 部分
【发布时间】:2018-10-03 12:58:57
【问题描述】:

我有一个查询,基本上是这样的:

SELECT 
    COUNT(*) OVER () AS TotalRowsFound,
        t.Title
        , t.ItemID
        , t.UploadDate
        , t.SevenDaySales as SelectedColumnSales
        , t.QuantitySold
        , t.CurrentPrice
        , t.CurrentPrice as LastSalePrice

FROM 
        dbo.SearchedUserItems t
WHERE 
        T.SearchedUserID = 5   
GROUP BY 
        t.ItemID,t.UploadDate,t.SelectedColumnSales,t.QuantitySold,t.CurrentPrice,LastSalePrice
ORDER BY SelectedColumnSales  DESC
OFFSET + 55*0 ROWS FETCH NEXT 55 ROWS ONLY;

问题是我无法完成查询,因为它说 SelectedColumnSales 和 LastSalePrice 列不存在...

有什么解决方法吗? =/

我如何才能完成此查询以使其实际工作并在 group by 语句或其他方式中使用别名?

有人可以帮帮我吗?

【问题讨论】:

  • 您在 GROUP BY 子句中混淆了列名和列别名。
  • 您需要在group by中直接使用t.SevenDaySales
  • 将 SelectColumnSales 换成组中的 t.SevenDaySales

标签: sql sql-server sql-server-2012 group-by alias


【解决方案1】:

由于 SQL Server 处理查询的方式,您不能在 GROUP BY 子句中使用别名。

SQL Server 将从 FROM 子句开始处理您的查询。 在您的情况下,处理将移至 WHERE,然后移至 GROUP BY,然后移至 SELECT。

因此,根据定义,您的别名 SelectedColumnSales 还不存在。

您需要根据定义在组中使用实际的列名,不能使用列别名。

将 GROUP BY 中的 t.SevenDaySales 和 LastSalePrice 替换为 t.CurrentPrice 的 SelectColumnSales

【讨论】:

    【解决方案2】:

    这是一个简单的修复。您不能在 GROUP BY 中使用 alias 名称。而是使用源列名称:

    SELECT 
        COUNT(*) OVER () AS TotalRowsFound,
            t.Title
            , t.ItemID
            , t.UploadDate
            , t.SevenDaySales as SelectedColumnSales
            , t.QuantitySold
            , t.CurrentPrice
            , t.CurrentPrice as LastSalePrice
    
    FROM 
            dbo.SearchedUserItems t
    WHERE 
            T.SearchedUserID = 5   
    GROUP BY 
            t.ItemID,t.UploadDate,t.SevenDaySales,t.QuantitySold,t.CurrentPrice
    ORDER BY SelectedColumnSales  DESC
    OFFSET + 55*0 ROWS FETCH NEXT 55 ROWS ONLY;
    

    【讨论】:

      【解决方案3】:

      我不明白您为什么在聚合查询中使用这样的窗口函数。一种做你想做的事的方法是使用apply:

      SELECT      . . . 
      FROM        dbo.searcheduseritems sui 
      CROSS apply (VALUES 
                  ( 
                              sevendaysales, 
                              currentprice 
                  ) 
                  ) v(selectedcolumnsales, lastsaleprice) 
      WHERE       sui.searcheduserid = 5 
      GROUP BY    sui.itemid, 
                  sui.uploaddate, 
                  v.selectedcolumnsales, 
                  sui.quantitysold, 
                  sui.currentprice, 
                  v.lastsaleprice 
      ORDER BY    v.selectedcolumnsales DESC offset + 55*0 rowsFETCH next 55 rows only
      

      这个查询对我来说没有意义(因为它很有用),但这会让你做你想做的事。

      【讨论】:

        【解决方案4】:

        将原始查询包装在派生表(子查询)中,然后您可以使用GROUP BY 中的列别名:

        SELECT
             COUNT(*) OVER () AS TotalRowsFound,
             dt.*
        FROM
        (
            SELECT 
                    t.Title
                    , t.ItemID
                    , t.UploadDate
                    , t.SevenDaySales as SelectedColumnSales
                    , t.QuantitySold
                    , t.CurrentPrice
                    , t.CurrentPrice as LastSalePrice
            FROM 
                    dbo.SearchedUserItems t
            WHERE 
                    T.SearchedUserID = 5   
        ) dt
        GROUP BY ItemID, UploadDate, SelectedColumnSales, QuantitySold, CurrentPrice, LastSalePrice
        ORDER BY SelectedColumnSales  DESC
        OFFSET + 55*0 ROWS FETCH NEXT 55 ROWS ONLY;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-11
          • 1970-01-01
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 2018-12-30
          • 1970-01-01
          • 2015-09-14
          相关资源
          最近更新 更多