Встроенный синтаксический анализатор XML позволяет вам превращать XML обратно в строки, а не в столбцы.Единственная возможная вещь, которую вы можете сделать, - это "отменить" агрегацию XML.Пожалуйста, ознакомьтесь с темой XML на SQL-сервере: http://msdn.microsoft.com/en-us/library/ms189887.aspx. Эта подтема, которую я использовал для ссылки на пространства имен: http://msdn.microsoft.com/en-us/library/ms177400.aspx.
Оттуда вы можете поворачивать результаты по своему усмотрению.Я адаптировал ваш запрос для этого:
WITH XMLNAMESPACES ('uri' as ns1)
SELECT phone, [1] AS FirstCall, [2] As SecondCall, [3] As ThirdCall, [4] As LastCall
FROM (SELECT RN, phone, IndexRef
FROM (SELECT phone, CAST((SELECT StartDate as 'ns1:StartDate'
FROM mycalls i WITH (NOLOCK) WHERE i.phone = d.phone FOR XML RAW('ns1:Prod'), ELEMENTS) AS XML) AS AllCalls
FROM [mydb].[dbo].[Accounts] d
WHERE phone in (31304,35549,39794,42711,51201,52529)) ns1
CROSS APPLY (SELECT row_number() over (order by relop.value('.','DateTime')) RN, relop.value('.','DateTime') AS CallLog
FROM ns1.AllCalls.nodes( N'//ns1:StartDate') AS ro(relop)) r) X
PIVOT(MAX(CallLog) FOR RN IN ([1],[2],[3],[4])) P
Очевидно, что для этого запроса XML просто раздут в середине и может быть пропущен (запрос выполнен).Тем не менее, этот метод полезен, если вы привязаны к выводу XML из какого-либо другого источника, кроме прямого запроса.
Без использования XML это намного проще.
SELECT P.phone, p.[1] AS FirstCallDate, p.[2] AS SecondCallDate, p.[3] AS ThirdCallDate, p.[4] AS LastCallDate
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY i.phone ORDER BY i.StartDate) i.phone, CallOrder, StartDate
FROM [mydb].[dbo].[Accounts] d
JOIN mycalls i ON d.phone = i.phone
WHERE d.SubmittedDate BETWEEN @MyStartDate AND @MyEndDate) X
PIVOT (MAX(StartDate) FOR CallOrder IN ([1], [2], [3], [4])) P
Чего вы не будетебыть в состоянии сделать в контексте SQL это создать сводную таблицу с произвольным числом столбцов (думал, что это было бы хорошо!)