MSSQL查询问题 - 将别名放在查询的GROUP BY部分

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSSQL查询问题 - 将别名放在查询的GROUP BY部分相关的知识,希望对你有一定的参考价值。

我有一个基本上看起来像这样的查询:

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语句或其他方式中使用别名?

有人可以帮我吗 ?

答案

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

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

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

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

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

另一答案

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

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;
另一答案

我不明白为什么你在聚合查​​询中使用这样的窗口函数。做你想做的事的一种方法是使用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

查询对我来说没有意义(因为它是有用的东西),但这将允许你做你想要的。

另一答案

将原始查询包装在派生表(子查询)中,然后您可以使用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;

以上是关于MSSQL查询问题 - 将别名放在查询的GROUP BY部分的主要内容,如果未能解决你的问题,请参考以下文章

2_01_MSSQL课程_查询01

在用于缩小 concat 结果的 GROUP CONCAT 子查询中找不到表别名

在 WHERE 或 GROUP BY 子句中使用列表别名

使用函数 SUM() 和 Group by 将 Mysql 查询转换为 SQL 查询

在 MSSQL 查询中使用分区排名

带有(来自)别名的 SQL 子查询