需要帮助理解一些使用PIVOT、COLEASE和CAST的SQL逻辑吗

需要帮助理解一些使用PIVOT、COLEASE和CAST的SQL逻辑吗,sql,tsql,pivot,coalesce,Sql,Tsql,Pivot,Coalesce,我需要弄清楚如何透视我拥有的一组数据,代码可以根据需要工作,但问题是我真的不明白为什么会这样。有谁能帮助一个新手,并准确地解释为什么下面的代码决定“选择@columns=COALESCE+ 为什么他在合并函数中指定了两个参数?只是返回该表中的所有列吗?如果是这样的话,有人能确切地说明它是如何做到的吗。我从这个网站上提取这个代码作为参考:() 提前谢谢 DECLARE @columns VARCHAR(8000) SELECT @columns = COALESCE(@columns + ',[

我需要弄清楚如何透视我拥有的一组数据,代码可以根据需要工作,但问题是我真的不明白为什么会这样。有谁能帮助一个新手,并准确地解释为什么下面的代码决定“选择@columns=COALESCE+

为什么他在合并函数中指定了两个参数?只是返回该表中的所有列吗?如果是这样的话,有人能确切地说明它是如何做到的吗。我从这个网站上提取这个代码作为参考:()

提前谢谢

DECLARE @columns VARCHAR(8000)

SELECT @columns = COALESCE(@columns + ',[' + cast(Variable as varchar) + ']',
'[' + cast(Variable as varchar)+ ']')
FROM #temp123
GROUP BY Variable


DECLARE @query VARCHAR(8000)

SET @query = '
SELECT *
FROM #temp123
PIVOT
(
MAX(VaribleValue)
FOR [Variable]
IN (' + @columns + ')
)
AS p'

EXECUTE(@query)

从代码的结构中,我可以看到查询是为动态透视设计的,这意味着列的数量可以变化;与传统方法不同,传统方法必须指定要透视的精确列

关键字与函数类似,但主要区别在于可以指定多个要检查的值:

例如,您可以使用
选择COALESCE(NULL,NULL,1,NULL)作为[Output]输出值将为1。这与第一个值为NULL时相同;返回下一个;如果第二个值为空;使用第三种方法;依此类推,直到找到第一个非空值


因此,在您的情况下,
COALESCE
关键字将检查附加到
变量
字段的
@columns
变量;如果它为NULL(如果
变量
字段中的任何值为NULL,则可能发生这种情况),那么它将只使用下一个语句。

从代码的结构中,我可以看出查询是为动态轴设计的,这意味着列的数量可以变化;与传统方法不同,传统方法必须指定要透视的精确列

关键字与函数类似,但主要区别在于可以指定多个要检查的值:

例如,您可以使用
选择COALESCE(NULL,NULL,1,NULL)作为[Output]输出值将为1。这与第一个值为NULL时相同;返回下一个;如果第二个值为空;使用第三种方法;依此类推,直到找到第一个非空值


因此,在您的情况下,
COALESCE
关键字将检查附加到
变量
字段的
@columns
变量;如果它为NULL(如果
变量
字段中的任何值为NULL,则可能发生这种情况),那么它将只使用下一个语句。

但我不明白的是,这不会创建某种类型的奇怪的无限循环吗?选择“@columns=COALESCE”(@columns…就像他在定义@columns时使用@columns一样?另外,他为什么要在变量的前面附加“@columns”?这仅仅是为了返回一个记录集,当变量为NULL时返回哪些列?不,COALESCE将识别“@columns”一开始为NULL,因此设置将'@columns'转换为第二个值。如果'@columns'不为NULL(设置为在代码的另一部分具有值),则'['+cast(变量为varchar)+']'将被附加到@columns的末尾。之所以放在这里,是因为您正在构建一个字符串,而字符串的作用是默认情况下CONCAT_NULL_YIELDS_NULL被设置为ON,这意味着如果您将任何值加上NULL,将产生一个NULL值。有关详细信息,请参阅。感谢@BorhanMooz,这是否意味着第一个参数被放进去了自动将合并转到第二个值?因为正如你所提到的,它将被视为NULL,当添加NULL时,将产生NULL值,因此总是将其强制到第二个值?嗯……那么为什么要合并呢?如果我将所有的合并放在一起,然后放入seco,它会起到相同的作用吗nd参数?在您的特定情况下,是的。但是假设在同一过程的多个部分中设置了“@columns”,这将确保如果在另一个点上“@columns”变量设置为NULL,那么它不会影响变量在当前位置的值。请尝试两个版本,一个有合并,另一个没有合并,然后查看t但我不明白的是,这不是创造了某种奇怪的无限循环吗?选择“@columns=COALESCE”(@columns…就像他在定义@columns时使用@columns一样?另外,他为什么要在变量的前面附加“@columns”?这仅仅是为了返回一个记录集,当变量为NULL时返回哪些列?不,COALESCE将识别“@columns”一开始为NULL,因此设置将'@columns'转换为第二个值。如果'@columns'不为NULL(设置为在代码的另一部分具有值),则'['+cast(变量为varchar)+']'将被附加到@columns的末尾。之所以放在这里,是因为您正在构建一个字符串,而字符串的作用是默认情况下CONCAT_NULL_YIELDS_NULL被设置为ON,这意味着如果您将任何值加上NULL,将产生一个NULL值。有关详细信息,请参阅。感谢@BorhanMooz,这是否意味着第一个参数被放进去了自动将合并转到第二个值?因为正如你所提到的,它将被视为NULL,当添加NULL时,将产生NULL值,因此总是将其强制到第二个值?嗯……那么为什么要合并呢?如果我将所有的合并放在一起,然后放入seco,它会起到相同的作用吗nd参数?在您的特定情况下,是的。但是假设在同一过程的多个部分中设置了“@columns”,这将确保如果在另一个点上“@columns”变量设置为NULL,那么它不会影响变量在当前位置的值。请尝试两个版本,一个有合并,另一个没有合并,然后查看t他认为这是事实。