我需要在SQL Server查询中连接两个数据表 - 一个包含交易信息,另一个包含已针对交易回答的营销问题。
这是一个精简的例子:
TransparentPictureBox
这里我遇到了问题:我需要将营销表中的问题转移到最终联接表中的列名,其中单元格值是答案。
问题是问题是从一个非常大的集合中随机化的,因此我无法在查询中定义它们。它需要动态捕获表中返回的所有问题,将它们生成为列,并在单元格中填充答案。
营销表本身就是日期范围查询的结果,因此包含的问题并不总是相同。这就是为什么我不能提前在PIVOT中定义它们。
我真的不知道从哪里开始,所以非常感谢任何帮助!
答案 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]'
返回
存储过程
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以获得更好的可视化效果