透视未定义的文本列

时间:2016-08-16 14:31:39

标签: sql sql-server join pivot

我需要在SQL Server查询中连接两个数据表 - 一个包含交易信息,另一个包含已针对交易回答的营销问题。

这是一个精简的例子:

TransparentPictureBox

这里我遇到了问题:我需要将营销表中的问题转移到最终联接表中的列名,其中单元格值是答案。

问题是问题是从一个非常大的集合中随机化的,因此我无法在查询中定义它们。它需要动态捕获表中返回的所有问题,将它们生成为列,并在单元格中填充答案。

营销表本身就是日期范围查询的结果,因此包含的问题并不总是相同。这就是为什么我不能提前在PIVOT中定义它们。

我真的不知道从哪里开始,所以非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

再一次,PIVOT很棒,但我使用Dynamic Pivots的存储过程

不确定您想要的输出,但您可以使用参数/组来播放

Select A.*
      ,B.Question
      ,B.Answer
 Into #Temp
 From Transction A
 Join Marteting B
   on (A.Transaction_ID=B.Transaction_ID)

Exec [prc-Pivot] '#Temp','Question','max(Answer)[]','Customer_ID,Transaction_ID,Date','count(*)[Records]'

返回

enter image description here

存储过程

CREATE PROCEDURE [dbo].[prc-Pivot] (
    @Source varchar(1000),          -- Any Table or Select Statement
    @PvotCol varchar(250),          -- Field name or expression ie. Month(Date)
    @Summaries varchar(250),        -- aggfunction(aggValue)[optionalTitle]
    @GroupBy varchar(250),          -- Optional additional Group By 
    @OtherCols varchar(500) )       -- Optional Group By or aggregates
AS

--Exec [prc-Pivot] 'Select Year=Year(TR_Date),* From [Chinrus-Series].[dbo].[DS_Treasury_Rates]','''Q''+DateName(QQ,TR_Date)','avg(TR_Y10)[-Avg]','Year','count(*)[Records],min(TR_Y10)[Min],max(TR_Y10)[Max],Avg(TR_Y10)[Avg]'
--Exec [prc-Pivot] '#Temp','Attribute','max(Description)[]','ID','count(*)[Records]'

Set NoCount On
Set Ansi_Warnings Off

Declare @Vals varchar(max),@SQL varchar(max);
Set @Vals = ''
Set @OtherCols= IsNull(', ' + @OtherCols,'')
Set @Source = case when @Source Like 'Select%' then @Source else 'Select * From '+@Source end
Create Table #TempPvot  (Pvot varchar(100))
Insert Into #TempPvot
Exec ('Select Distinct Convert(varchar(100),' + @PvotCol + ') as Pvot FROM (' + @Source + ') A')
Select @Vals = @Vals + ', isnull(' + Replace(Replace(@Summaries,'(','(CASE WHEN ' + @PvotCol + '=''' + Pvot +  ''' THEN '),')[', ' END),0) As [' + Pvot ) From #TempPvot Order by Pvot
Drop Table #TempPvot
Set @SQL = Replace('Select ' + Isnull(@GroupBy,'') + @OtherCols + @Vals + ' From (' + @Source + ') PvtFinal ' + case when Isnull(@GroupBy,'')<>'' then 'Group By ' + @GroupBy + ' Order by ' + @GroupBy else '' end,'Select , ','Select ')
--Print @SQL
Exec (@SQL)


Set NoCount Off
Set Ansi_Warnings on

答案 1 :(得分:0)

您可以使用动态SQL轻松实现此目的。例如:

DECLARE @dynPiv varchar(max)
DECLARE @PivotQuery

SET @dynPiv = STUFF((SELECT ',' + QUOTENAME(Question)
                    FROM MarketingQuestions
                    FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(MAX)') 
                    ,1,1,'')

SET @PivotQuery = '[YOUR QUERY HERE]
PIVOT ( [YOUR PIVOT GOES HERE] FOR Question IN ' + @dynPiv + ')'

没有输入整个代码,但是应该传达这个想法。 @dynPiv将获取Question的所有不同值的值。打印@dynPiv以获得更好的可视化效果