动态转置/透视SQL数据

时间:2015-01-23 18:40:54

标签: sql-server tsql pivot pivot-table

我很抱歉提出这个问题,因为这个话题有很多,但我一直在寻找一般的Pivot问题而没有找到解决方案,因为我增加了一个维度。处理,我无法理解它。 确定"体验"当他们一起比赛的时候(这是我必须处理的最简单的例子)我需要找到一个特定的比赛,以前的比赛中任何一部分队员参加过以用户友好的形式,课程。 如果您不想阅读结构,请访问the SQL Fiddle Shortcut 我有联系人,汽车和比赛这些简单的权利。然后有条目将汽车绑在比赛中。和机组人员,包括一个特定车辆的联系人。

现在,对于给定的参赛作品(也就是给定比赛中的特定赛车),我需要找到赛车参加的所有先前比赛,并比较当前参赛队员可能参加的比赛。

例如,对于条目ID 5(=="快车"在比赛"当前比赛")我需要列出工作人员并制作X标记,如果他们也在任何以前的比赛(==比赛ID<要检查的ID)在同一辆车"快车"。

我正在寻找的最终结果是 - 尽管现在的比赛"列是超级的,因为这是检查的起点。

                Current Race | Old Race | Even Older Race
Gladys Friday       X             X            X
Mandy Lifeboats     X             X            X
Justin Case         X       
Candy Barr          X       
Harvey Theryet      X             X            X

如果你能帮助我,那就太好了,谢谢!

2 个答案:

答案 0 :(得分:1)

假设联赛只能在每场比赛中出现一次,那么在比赛名称上执行COUNT会产生一个二进制表,表示某人是否出现在比赛中。如果出于某种原因同一个人可以多次参加同一场比赛,那么你只会得到一个大于1的数字。

SELECT *
FROM (
  SELECT ContactName, RaceName FROM [dbo].[Entries] AS e 
    INNER JOIN [dbo].[Races] AS r ON [e].[Races_ID] = r.[ID]
    INNER JOIN [dbo].[Cars] AS c ON e.[Cars_ID] = c.[ID]
    LEFT JOIN Crews ON e.ID = Crews.Entries_ID
    LEFT JOIN Contacts ON [Contacts].[ID] = Crews.Contacts_ID
) src
PIVOT (
    COUNT(RaceName)
    FOR RaceName IN ([Current Race], [Old Race], [Even Older Race])
) pvt

答案 1 :(得分:1)

您可以使用动态查询来执行此操作,该查询将“适应”结果将具有的任何种族。这是一个例子,它给出了与你的例子相同的结果:

DECLARE @entry INT, @race INT, @car INT, @races VARCHAR(8000), @query NVARCHAR(MAX)
SET @entry = 5

--SAVE THE RACE ID AND CAR ID OF THE SPECIFIED ENTRY
SELECT @race = Races_ID, @car = Cars_ID
FROM dbo.Entries
WHERE ID = @entry

--SELECT THE RACES WITH THE SAME CAR WHERE THE CREW MEMBERS OF THE SPECIFIED ENTRY HAVE PARTICIPATED BEFORE
SELECT cr.ID, cr.contactname, r.ID raceid, r.racename
INTO #Exp
FROM dbo.Contacts cr
INNER JOIN dbo.Crews cs
ON cr.ID = cs.Contacts_ID
INNER JOIN dbo.Entries e
ON cs.Entries_ID = e.ID AND e.Races_ID <= @race AND e.Cars_ID = @car
LEFT OUTER JOIN dbo.Races r
ON e.Races_ID = r.ID
ORDER BY cr.ID, r.ID DESC

--CREATE THE DINAMIC LIST OF COLUMNS (RACE NAMES) WE'RE GOING TO USE IN THE PIVOT
SELECT @races = ISNULL(@races + ',[', '[') + r.racename + ']'
FROM (SELECT DISTINCT raceid, racename FROM #Exp) r
ORDER BY r.raceid DESC

--GENERATE AND EXECUTE THE DYNAMIC QUERY
SET @query = 
'SELECT contactname,' + @races +
'FROM (SELECT ID contact_id, ID, contactname, racename FROM #Exp) p
PIVOT
(COUNT(ID) FOR p.racename IN ( ' + @races + ' )) as pvt
ORDER BY contact_id'
EXEC sys.sp_executesql @query

DROP TABLE #Exp

这将生成一个1和0的表格,指定指定条目的机组成员之前的比赛。因为动态查询将适应所有种类,所以无所谓并且有多少种族。

*此查询的结果是认为与指定条目具有相同车辆的比赛;你把它放在Old Race上的Mandy Lifeboats与另一辆车有关。也许我误解了这个问题,或者它确实令人困惑?