簡體   English   中英

MSSQL查詢問題-將別名放在查詢的GROUP BY部分中

[英]MSSQL query issue - putting alias name in GROUP BY part of the query

我有一個查詢,基本上看起來像這樣:

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中將SelectColumnSales替換為t.SevenDaySales,將LastSalePrice替換為t.CurrentPrice。

我不明白為什么您在聚合查詢中使用像這樣的窗口函數。 一種執行所需用途的方法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使用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;

將原始查詢包裝在派生表(子查詢)中,然后可以在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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM