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