SQL Server-使用声明的变量标识数据透视列
我创建了一个SQL Server Pivot查询,用于透视和显示满足某些参数的贷款机构的利率和价格。这个查询非常有效,但问题是我必须手动识别并键入利率,这些利率将成为我创建的每个单独查询所要使用的列名 我希望能够简单地声明一个变量,该变量搜索表并标识该产品分组的最低速率,然后使用该变量标识我希望重点关注的列 我已经创建了变量,它成功地找到了正确的速率,但是当我替换[4]、[4.125]中的columnrates名称时,。。。对于[@RateMIN],@RateMIN2],…等,我收到一个错误,抱怨:将数据类型nvarchar转换为float时出错 奇怪的是,Rate列已经是一个float,那么为什么它试图将它从nvarchar转换为float呢?我想pivot函数一定有一些方面我没有考虑到或者不理解 根据请求,添加现在可用但没有变量的查询SQL Server-使用声明的变量标识数据透视列,sql,sql-server,Sql,Sql Server,我创建了一个SQL Server Pivot查询,用于透视和显示满足某些参数的贷款机构的利率和价格。这个查询非常有效,但问题是我必须手动识别并键入利率,这些利率将成为我创建的每个单独查询所要使用的列名 我希望能够简单地声明一个变量,该变量搜索表并标识该产品分组的最低速率,然后使用该变量标识我希望重点关注的列 我已经创建了变量,它成功地找到了正确的速率,但是当我替换[4]、[4.125]中的columnrates名称时,。。。对于[@RateMIN],@RateMIN2],…等,我收到一个错误,抱
DECLARE @ProductX as VARCHAR(MAX)
DECLARE @statenameX as VARCHAR(MAX)
DECLARE @purposeTypeX as VARCHAR(MAX)
DECLARE @ficoX as float
DECLARE @loanSizeX as float
DECLARE @LTVx as float
SET @ProductX = '30YearFixedProduct'
SET @statenameX = 'CA'
SET @purposeTypeX = 'Purchase'
SET @ficoX = 740
SET @loanSizeX = 900000
SET @LTVx = 70
SELECT
LenderName as 'Lenders',
[4] as '4.000%',
[4.125] as '4.125%',
[4.25] as '4.250%',
[4.375] as '4.375%',
[4.5] as '4.500%',
[4.625] as '4.625%',
[4.75] as '4.750%',
[4.875] as '4.875%'
from
(
SELECT
[LenderName],[Price],[Rate]
FROM
PricingTable
WHERE
Product = @ProductX AND
statename = @statenameX AND
PurposeType = @purposeTypeX AND
FICO = @ficoX AND
LoanSize = @loanSizeX AND
LTV = @LTVx
) as SourceTable2
Pivot
(
avg(Price) for Rate IN ([4],[4.125],[4.25],[4.375],[4.5],[4.625],[4.75],[4.875])
)
as PivotTable2
Order by
CASE WHEN [4.125] is null then 1 else 0 end,
[4.125]
添加查询,我尝试添加变量@RateMin并使用它定义一个列名。下面的查询就是给出错误的查询
DECLARE @ProductX as VARCHAR(MAX)
DECLARE @statenameX as VARCHAR(MAX)
DECLARE @purposeTypeX as VARCHAR(MAX)
DECLARE @ficoX as float
DECLARE @loanSizeX as float
DECLARE @LTVx as float
DECLARE @rateMIN as float
SET @rateMIN = (SELECT min([rate]) FROM PricingTable WHERE
Product = @ProductX AND
statename = @statenameX AND
PurposeType = @purposeTypeX AND
FICO = @ficoX AND
LoanSize = @loanSizeX AND
LTV = @LTVx)
SET @ProductX = '30YearFixedProduct'
SET @statenameX = 'CA'
SET @purposeTypeX = 'Purchase'
SET @ficoX = 740
SET @loanSizeX = 900000
SET @LTVx = 70
SELECT
LenderName as 'Lenders',
[@rateMIN] as '4.000%',
[4.125] as '4.125%',
[4.25] as '4.250%',
[4.375] as '4.375%',
[4.5] as '4.500%',
[4.625] as '4.625%',
[4.75] as '4.750%',
[4.875] as '4.875%'
from
(
SELECT
[LenderName],[Price],[Rate]
FROM
PricingTable
WHERE
Product = @ProductX AND
statename = @statenameX AND
PurposeType = @purposeTypeX AND
FICO = @ficoX AND
LoanSize = @loanSizeX AND
LTV = @LTVx
) as SourceTable2
Pivot
(
avg(Price) for Rate IN ([@rateMIN],[4.125],[4.25],[4.375],[4.5],[4.625],[4.75],[4.875])
)
as PivotTable2
Order by
CASE WHEN [4.125] is null then 1 else 0 end,
[4.125]
好吧,我终于明白了,所以我回来这里发布结果,这样其他人可以从我的经验中受益 我学到的最重要的一点是,在创建和测试动态SQL时,不要试图简单地执行查询。当您构建这样一个查询时,您需要首先打印它。然后将结果复制并粘贴到新的查询窗口中。这将允许您查看实际连接的内容以及遇到的问题!我没有在网上看到这个建议 我遇到的第二大问题是,我需要对我的列名采取不同的方法。我不得不使用我在互联网上找到的教程中的COALESCE语句和QUOTENAME。这一系列语句在定价表中查找可用的rate值,然后将它们转换为用于构建SQL语句的文本 我仍然觉得必须使用动态SQL与我所做的其他编程相比有点落后。为什么我需要将整个select语句转换为文本?为什么不简单地保持原样,然后将变量转换成文本,然后让SQL运行它呢?我得考虑一下。我不能理解SQL如何处理/运行查询的复杂性 下面是完成的动态SQL查询,它可以正常工作。请注意,我正在打印结果,但我可以同样轻松地执行它:
DECLARE @ProductX as VARCHAR(MAX)
DECLARE @stateX as VARCHAR(MAX)
DECLARE @PurposeX as VARCHAR(MAX)
DECLARE @ficoX as NVARCHAR(MAX)
DECLARE @loanSizeX as NVARCHAR(MAX)
DECLARE @LTVx as NVARCHAR(MAX)
Declare @RateX NVARCHAR(MAX)
Declare @RateX_2 NVARCHAR(MAX)
declare @SQL as NVARCHAR(MAX)
DECLARE @Columns as VARCHAR(MAX)
SET @ProductX = '30YearFixedProduct'
SET @stateX = 'CA'
SET @PurposeX = 'Purchase'
SET @ficoX = 740
SET @loanSizeX = 900000
SET @LTVx = 70
SELECT @Columns = COALESCE(@Columns + ',','') + QUOTENAME(RATE)
FROM
(
SELECT DISTINCT RATE
FROM PricingTable WHERE
Product = @ProductX AND
state = @stateX AND
Purpose = @PurposeX AND
FICO = @ficoX AND
LoanSize = @loanSizeX AND
LTV = @LTVx)
AS TableNew
set @RateX = (select min(rate) from PricingTable WHERE
Product = @ProductX AND
state = @stateX AND
Purpose = @PurposeX AND
FICO = @ficoX AND
LoanSize = @loanSizeX AND
LTV = @LTVx)
set @RateX_2 = cast(@RateX as float) + .125
SET @SQL = '
SELECT
Lenders,
'+@Columns+'
from
(
SELECT
[Lenders],[Price],[Rate]
FROM
PricingTable
WHERE
Product = '''+@ProductX+''' AND
state = '''+@stateX+''' AND
Purpose = '''+@PurposeX+''' AND
FICO = '''+@ficoX+''' AND
LoanSize = '''+@loanSizeX+''' AND
LTV = '''+@LTVx+'''
) as SourceTable2
Pivot
(
avg(Price) for Rate IN ('+@Columns+')
)
as PivotTable2
'
PRINT (@SQL)
你能发布这个查询,或者至少是它的一个代表性样本吗?好吧,如果@RateMIN实际上是一个FLOAT,你就不能直接用字符串连接它。此外,您正在寻找的似乎是一个使用动态枢轴方法的动态枢轴+1。有几种不同的方法来实现它,搜索DynamicPivot on会给出很多例子。我将不得不对DynamicPivot方法进行更多的研究。我只是在概念化如何使用它来解决这个问题上遇到了困难。我见过这种方法的例子,但从未实际使用过。为什么我不能把变量转换成字符串呢?这不就是我输入数字4时的解释吗?假设你在拉链里有一个三明治,你不能不把三明治从拉链里拿出来就吃它,除非你喜欢拉链的味道:。同样的原则也适用于此。