SQL 服务器:将 select 列表中的列与别名相乘
SQL Server : multiply column with alias name in select list
我的查询中有一个 select 列表,如下所示:
SELECT
COUNT(*) OVER () AS TotalRowsFound,
MIN(t.Title) AS Title,
t.ItemID, ' + @selectedColumn + ' as SelectedColumnSales ' + ',
t.CurrentPrice,
(t.CurrentPrice * t.SelectedColumnSales) as TotalRevenuePerItem
FROM
dbo.SearchedUserItems t
我遇到问题的查询部分如下:
(t.CurrentPrice * t.SelectedColumnSales) as TotalRevenuePerItem
在 select 列表中... "SelectedColumnSales" 可以是不同的列,具体取决于我传递给查询的内容,如下所示:
DECLARE @selectedColumn NVARCHAR(500)
IF(@SelectedRange=7)
SET @selectedColumn = 't.SevenDaySales'
ELSE IF (@SelectedRange=14)
SET @selectedColumn='t.FourteenDaySales'
ELSE IF (@SelectedRange=21)
SET @selectedColumn='t.TwentyOneDaySales'
ELSE IF (@SelectedRange=30)
SET @selectedColumn='t.ThirtyDaySales'
现在要获得每个项目的收入列,我需要像上面那样将这两个相乘,但查询会抛出此错误:
Inner exception: SqlException: Invalid column name 'SelectedColumnSales'.
如何在 select 列表中将动态列与静态列相乘?
有人可以帮我吗?
您可以尝试使用 case when 子句
直接使用查询中的登录,而不是字符串连接
SELECT
COUNT(*) OVER () AS TotalRowsFound,
MIN(t.Title) AS Title
, t.ItemID
, case when @SelectedRange=7 then t.SevenDaySales
when @SelectedRange=14 then t.FourteenDaySales
when @SelectedRange=21 then t.TwentyOneDaySales
when (@SelectedRange=30 then t.ThirtyDaySales end
as SelectedColumnSales
, t.CurrentPrice
, (t.CurrentPrice * t.SelectedColumnSales) as TotalRevenuePerItem
FROM
dbo.SearchedUserItems t
将您的查询包装在派生的 table 中,然后您可以在其外部引用这些列:
select dt.TotalRowsFound, dt.Title, ... ,
(dt.CurrentPrice * dt.SelectedColumnSales) as TotalRevenuePerItem
from
(
SELECT
COUNT(*) OVER () AS TotalRowsFound,
MIN(t.Title) AS Title
, t.ItemID
,' + @selectedColumn + ' as SelectedColumnSales ' +
', t.CurrentPrice
FROM
dbo.SearchedUserItems t
) dt
如果您正在编写一个动态查询(看起来就像是这样),您只需将变量放入等式中即可
declare @sql nvarchar(max)
set @sql = 'select
COUNT(*) OVER () AS TotalRowsFound,
MIN(t.Title) AS Title
, t.ItemID
,' + @selectedColumn + ' as SelectedColumnSales ' +
', t.CurrentPrice
, (t.CurrentPrice * ' + @selectedColumn + ') as TotalRevenuePerItem
FROM
dbo.SearchedUserItems t'
exec(@sql)
或许通过用户选择的INDEX,使用CHOOSE()
让我们假设:
Item Index
SevenDaySales 0
FourteenDaySales 1
TwentyOneDaySales 2
ThirtyDaySales 3
那你可以
SELECT COUNT(*) OVER () AS TotalRowsFound
,MIN(t.Title) AS Title
,t.ItemID
,choose(@Index+1,t.SevenDaySales,t.FourteenDaySales,t.TwentyOneDaySales,t.ThirtyDaySales) as SelectedColumnSales
,t.CurrentPrice
,(t.CurrentPrice * choose(@Index+1,t.SevenDaySales,t.FourteenDaySales,t.TwentyOneDaySales,t.ThirtyDaySales)) as TotalRevenuePerItem
FROM dbo.SearchedUserItems t
如果你不想传递索引,而不是 @Index+1
,你可以 @SelectedRange/7
我的查询中有一个 select 列表,如下所示:
SELECT
COUNT(*) OVER () AS TotalRowsFound,
MIN(t.Title) AS Title,
t.ItemID, ' + @selectedColumn + ' as SelectedColumnSales ' + ',
t.CurrentPrice,
(t.CurrentPrice * t.SelectedColumnSales) as TotalRevenuePerItem
FROM
dbo.SearchedUserItems t
我遇到问题的查询部分如下:
(t.CurrentPrice * t.SelectedColumnSales) as TotalRevenuePerItem
在 select 列表中... "SelectedColumnSales" 可以是不同的列,具体取决于我传递给查询的内容,如下所示:
DECLARE @selectedColumn NVARCHAR(500)
IF(@SelectedRange=7)
SET @selectedColumn = 't.SevenDaySales'
ELSE IF (@SelectedRange=14)
SET @selectedColumn='t.FourteenDaySales'
ELSE IF (@SelectedRange=21)
SET @selectedColumn='t.TwentyOneDaySales'
ELSE IF (@SelectedRange=30)
SET @selectedColumn='t.ThirtyDaySales'
现在要获得每个项目的收入列,我需要像上面那样将这两个相乘,但查询会抛出此错误:
Inner exception: SqlException: Invalid column name 'SelectedColumnSales'.
如何在 select 列表中将动态列与静态列相乘?
有人可以帮我吗?
您可以尝试使用 case when 子句
直接使用查询中的登录,而不是字符串连接 SELECT
COUNT(*) OVER () AS TotalRowsFound,
MIN(t.Title) AS Title
, t.ItemID
, case when @SelectedRange=7 then t.SevenDaySales
when @SelectedRange=14 then t.FourteenDaySales
when @SelectedRange=21 then t.TwentyOneDaySales
when (@SelectedRange=30 then t.ThirtyDaySales end
as SelectedColumnSales
, t.CurrentPrice
, (t.CurrentPrice * t.SelectedColumnSales) as TotalRevenuePerItem
FROM
dbo.SearchedUserItems t
将您的查询包装在派生的 table 中,然后您可以在其外部引用这些列:
select dt.TotalRowsFound, dt.Title, ... ,
(dt.CurrentPrice * dt.SelectedColumnSales) as TotalRevenuePerItem
from
(
SELECT
COUNT(*) OVER () AS TotalRowsFound,
MIN(t.Title) AS Title
, t.ItemID
,' + @selectedColumn + ' as SelectedColumnSales ' +
', t.CurrentPrice
FROM
dbo.SearchedUserItems t
) dt
如果您正在编写一个动态查询(看起来就像是这样),您只需将变量放入等式中即可
declare @sql nvarchar(max)
set @sql = 'select
COUNT(*) OVER () AS TotalRowsFound,
MIN(t.Title) AS Title
, t.ItemID
,' + @selectedColumn + ' as SelectedColumnSales ' +
', t.CurrentPrice
, (t.CurrentPrice * ' + @selectedColumn + ') as TotalRevenuePerItem
FROM
dbo.SearchedUserItems t'
exec(@sql)
或许通过用户选择的INDEX,使用CHOOSE()
让我们假设:
Item Index
SevenDaySales 0
FourteenDaySales 1
TwentyOneDaySales 2
ThirtyDaySales 3
那你可以
SELECT COUNT(*) OVER () AS TotalRowsFound
,MIN(t.Title) AS Title
,t.ItemID
,choose(@Index+1,t.SevenDaySales,t.FourteenDaySales,t.TwentyOneDaySales,t.ThirtyDaySales) as SelectedColumnSales
,t.CurrentPrice
,(t.CurrentPrice * choose(@Index+1,t.SevenDaySales,t.FourteenDaySales,t.TwentyOneDaySales,t.ThirtyDaySales)) as TotalRevenuePerItem
FROM dbo.SearchedUserItems t
如果你不想传递索引,而不是 @Index+1
,你可以 @SelectedRange/7