TSQL Pivot没有集合函数
我有这样的桌子…
CustomerID DBColumnName Data -------------------------------------- 1 FirstName Joe 1 MiddleName S 1 LastName Smith 1 Date 12/12/2009 2 FirstName Sam 2 MiddleName S 2 LastName Freddrick 2 Date 1/12/2009 3 FirstName Jaime 3 MiddleName S 3 LastName Carol 3 Date 12/1/2009
我想要这个…
这可能使用PIVOT?
CustomerID FirstName MiddleName LastName Date ---------------------------------------------------------------------- 1 Joe S Smith 12/12/2009 2 Sam S Freddrick 1/12/2009 3 Jaime S Carol 12/1/2009
你可以使用MAX聚合,它仍然可以工作。 一个值的最大值=该值
在这种情况下,您也可以在customerid上自我join5次,按每个表引用进行dbColumnName筛选。 它可能会更好。
是的,但是为什么 !!??
Select CustomerID, Min(Case DBColumnName When 'FirstName' Then Data End) FirstName, Min(Case DBColumnName When 'MiddleName' Then Data End) MiddleName, Min(Case DBColumnName When 'LastName' Then Data End) LastName, Min(Case DBColumnName When 'Date' Then Data End) Date From table Group By CustomerId
好的,对于这个可怜的问题抱歉。 gbn让我走上正轨。 这是我正在寻找答案。
SELECT [FirstName], [MiddleName], [LastName], [Date] FROM #temp PIVOT ( MIN([Data]) FOR [DBColumnName] IN ([FirstName], [MiddleName], [LastName], [Date]) )AS p
然后,我不得不使用一个while语句,并将上面的语句构build为一个varchar并使用dynmaic sql。
使用这样的东西
SET @fullsql = @fullsql + 'SELECT ' + REPLACE(REPLACE(@fulltext,'(',''),')','') SET @fullsql = @fullsql + 'FROM #temp ' SET @fullsql = @fullsql + 'PIVOT' SET @fullsql = @fullsql + '(' SET @fullsql = @fullsql + ' MIN([Data])' SET @fullsql = @fullsql + ' FOR [DBColumnName] IN '+@fulltext SET @fullsql = @fullsql + ')' SET @fullsql = @fullsql + 'AS p' EXEC (@fullsql)
有一个使用while循环构build@fulltext,并从表中select不同的列名称。 感谢您的答案。
SELECT main.CustomerID, f.Data AS FirstName, m.Data AS MiddleName, l.Data AS LastName, d.Data AS Date FROM table main INNER JOIN table f on f.CustomerID = main.CustomerID INNER JOIN table m on m.CustomerID = main.CustomerID INNER JOIN table l on l.CustomerID = main.CustomerID INNER JOIN table d on d.CustomerID = main.CustomerID WHERE f.DBColumnName = 'FirstName' AND m.DBColumnName = 'MiddleName' AND l.DBColumnName = 'LastName' AND d.DBColumnName = 'Date'
编辑:我已经写了这个没有编辑器,并没有运行SQL。 我希望,你明白了。
OP没有实际上需要枢轴而没有聚集,但对于你们来这里知道如何看:
sql参数化cte查询
这个问题的答案涉及到一个不需要聚合的枢纽的情况,所以这样做的一个例子是解决scheme的一部分。
WITH pivot_data AS ( SELECT customerid, -- Grouping Column dbcolumnname, -- Spreading Column data -- Aggregate Column FROM pivot2 ) SELECT customerid, [firstname], [middlename], [lastname] FROM pivot_data PIVOT (max(data) FOR dbcolumnname IN ([firstname],[middlename],[lastname])) AS p;
尝试这个:
SELECT CUSTOMER_ID, MAX(FIRSTNAME) AS FIRSTNAME, MAX(LASTNAME) AS LASTNAME ... FROM ( SELECT CUSTOMER_ID, CASE WHEN DBCOLUMNNAME='FirstName' then DATA ELSE NULL END AS FIRSTNAME, CASE WHEN DBCOLUMNNAME='LastName' then DATA ELSE NULL END AS LASTNAME, ... and so on ... GROUP BY CUSTOMER_ID ) TEMP GROUP BY CUSTOMER_ID
这应该工作:
select * from (select [CustomerID] ,[Demographic] ,[Data] from [dbo].[pivot] ) as Ter pivot (max(Data) for Demographic in (FirstName, MiddleName, LastName, [Date]))as bro
这是build立数据透视查询dynamic字段的好方法:
– 汇总一个tmp表的值
declare @STR varchar(1000) SELECT @STr = COALESCE(@STr +', ', '') + QUOTENAME(DateRange) from (select distinct DateRange, ID from ##pivot)d order by ID
—看到生成的字段
print @STr exec(' .... pivot code ... pivot (avg(SalesAmt) for DateRange IN (' + @Str +')) AS P order by Decile')