当没有列增加时,PIVOT给出错误的输出

时间:2015-06-14 15:35:10

标签: sql-server sql-server-2008 pivot pivot-table

我有一个表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的任何限制我需要考虑

两个Db都是相同版本的SQL Server 2008 SP2。

提前致谢。

实施例: 输入Channel_merge表(column1到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 个答案:

答案 0 :(得分:1)

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

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)

供您参考:

enter image description here