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部分的主要内容,如果未能解决你的问题,请参考以下文章
在用于缩小 concat 结果的 GROUP CONCAT 子查询中找不到表别名