当没有列增加时,PIVOT 给出不正确的输出

Posted

技术标签:

【中文标题】当没有列增加时,PIVOT 给出不正确的输出【英文标题】:PIVOT giving incorrect output when no of columns increase 【发布时间】:2015-06-14 15:35:10 【问题描述】:

我有一个表 channel_merge 喜欢

Channel_1 | Channel_2
----------------------
COLUMN1   | COLUMN343
COLUMN1   | COLUMN392
COLUMN1   | COLUMN267
COLUMN1   | COLUMN198
COLUMN1   | COLUMN400
COLUMN2   | COLUMN348
COLUMN2   | COLUMN97
COLUMN1   | COLUMN97
COLUMN3   | COLUMN343
COLUMN3   | COLUMN65
COLUMN4   | COLUMN33

其中 columnX 的值介于 column1 到 column512 之间 行数可以在 8k 到 20k 之间变化 我想要一个矩阵 (512X512),其值表示矩阵中各个列组合之间的条目数。

我打破了 512 个 100 个 int 组,使用 PIVOT 处理,然后附加到完整矩阵中 使用的枢轴函数如下枢轴查询

select [COLUMN1],[COLUMN10],[COLUMN100],[COLUMN101],[COLUMN102],[COLUMN103],[COLUMN104],[COLUMN105],[COLUMN106],[COLUMN107],[COLUMN108],[COLUMN109],[COLUMN11],[COLUMN110],[COLUMN111],[COLUMN112],[COLUMN113],[COLUMN114]..100 columns INTO FINAL1
from 
(
select channel_1,channel_1 as CHANNEL_11,CHANNEL_2 from CHANNEL_MERGE 
) P
pivot 
(
count(CHANNEL_11) for CHANNEL_2 in ([COLUMN1],[COLUMN10],[COLUMN100],[COLUMN101],[COLUMN102],[COLUMN103],[COLUMN104],[COLUMN105],[COLUMN106],[COLUMN107],[COLUMN108],[COLUMN109],[COLUMN11],[COLUMN110],[COLUMN111],[COLUMN112],[COLUMN113],[COLUMN114]....100columns)
) as pvt

在一个数据库中运行良好

但最近在使用其他数据库。 使用我的程序(包含上述查询)运行不同时间时,它会返回不正确的结果和不同的结果

当我将分组从 100 列减少到 30 列时,结果看起来很合适。

能否请您帮助我确定哪些数据库参数正在影响或可能影响上述查询的结果。

我需要考虑的任何 Pivot 限制

两个数据库都是相同版本的 SQL server 2008 SP2。

提前致谢。

示例: 输入Channel_merge表(column1 to column5)考虑5X5

channel_1   channel_2
column1 column2
column2 column1
column2 column3
column2 column3
column2 column3
column2 column4
column3 column2
column3 column2
column3 column2
column3 column5
column3 column5
column4 column2
column5 column3
column5 column3

所以预期的输出是矩阵 5X5

 0  1   0   0   0
 1  0   3   1   0
 0  3   0   0   2
 0  1   0   0   0
 0  0   2   0   0

【问题讨论】:

您能否提供一些示例数据和预期的输出? 【参考方案1】:

多田.. 这个很棘手,但玩得很开心..

declare @distcols as nvarchar(max) = ''
select @distcols=@distcols +'['+ (a.channel_2)+'],' from (select distinct channel_2 from TableName) a
set @distcols = substring(@distcols,0,len(@distcols))
declare @dynamicsql as nvarchar(max) = 'select * from
(   
        select channel_1, channel_2, count(channel_1) as distinctcount from TableName 
        group by channel_1, channel_2

) as sourcetable
pivot
(
    Min(distinctcount)
    FOR channel_2 IN ('

set @dynamicsql = @dynamicsql + @distcols + ')
)
as pivottable'

print @dynamicsql
exec (@dynamicsql)

供您参考:

【讨论】:

感谢您的输入和时间..我的问题是它在服务器中失败..当您在@distcolumns 中对 100 列进行分组时..(在其他服务器中成功)..当减少到 60 列时..它可以工作...但是当channel_merge中的数据增加时失败..我希望它与服务器的内存问题(不确定。).. fail 是什么意思?它是否显示任何特定错误? 对不起它返回不正确的(矩阵值将是混乱的)输出但没有任何错误.. 现在我发现表列(channel_1 和 channel_2)被定义为 varchar(2000)(由某些人实际)..现在我将它更改为 varchar(130) (这是必需的),结果看起来很正确..我认为在处理时..它需要更多内存并导致输出损坏。(我不确定)但现在看起来很好.. 是的,您还可以做的一件事是转换为 nvarchar(20) 可能是,同时计算 @distcols 或更改列定义。很高兴它解决了您的问题 大家好,即使在将列组从 100 减少到 60 之后,这个问题也会在服务器中再次重复。当我将其减少到 30 时,结果看起来很好。我想找到原因..这 30 也可能在一段时间后无法工作......提前致谢..

以上是关于当没有列增加时,PIVOT 给出不正确的输出的主要内容,如果未能解决你的问题,请参考以下文章

NORMDIST 函数没有给出正确的输出

SQL 中的 Pivot 语法错误,为啥我得到不正确的结果?

PIVOT/UNPIVOT 多于一列

使用大数字时背包没有给出正确的输出

为啥 QDatastream 没有给出正确的输出

SQL中PIVOT 行列转换