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

问题描述 投票:0回答:4

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

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 sql-server sql-server-2012 group-by alias
4个回答
2
投票

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

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

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

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

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


1
投票

这是一个简单的修复。你不能在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;

1
投票

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

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


0
投票

将原始查询包装在派生表(子查询)中,然后您可以使用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;
© www.soinside.com 2019 - 2024. All rights reserved.