Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-使用声明的变量标识数据透视列_Sql_Sql Server - Fatal编程技术网

SQL Server-使用声明的变量标识数据透视列

SQL Server-使用声明的变量标识数据透视列,sql,sql-server,Sql,Sql Server,我创建了一个SQL Server Pivot查询,用于透视和显示满足某些参数的贷款机构的利率和价格。这个查询非常有效,但问题是我必须手动识别并键入利率,这些利率将成为我创建的每个单独查询所要使用的列名 我希望能够简单地声明一个变量,该变量搜索表并标识该产品分组的最低速率,然后使用该变量标识我希望重点关注的列 我已经创建了变量,它成功地找到了正确的速率,但是当我替换[4]、[4.125]中的columnrates名称时,。。。对于[@RateMIN],@RateMIN2],…等,我收到一个错误,抱

我创建了一个SQL Server Pivot查询,用于透视和显示满足某些参数的贷款机构的利率和价格。这个查询非常有效,但问题是我必须手动识别并键入利率,这些利率将成为我创建的每个单独查询所要使用的列名

我希望能够简单地声明一个变量,该变量搜索表并标识该产品分组的最低速率,然后使用该变量标识我希望重点关注的列

我已经创建了变量,它成功地找到了正确的速率,但是当我替换[4]、[4.125]中的columnrates名称时,。。。对于[@RateMIN],@RateMIN2],…等,我收到一个错误,抱怨:将数据类型nvarchar转换为float时出错

奇怪的是,Rate列已经是一个float,那么为什么它试图将它从nvarchar转换为float呢?我想pivot函数一定有一些方面我没有考虑到或者不理解

根据请求,添加现在可用但没有变量的查询

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时的解释吗?假设你在拉链里有一个三明治,你不能不把三明治从拉链里拿出来就吃它,除非你喜欢拉链的味道:。同样的原则也适用于此。