2016-06-14 3 views
1

я иметь следующую структуру таблицы (частично исключены для ясности вопроса):Возвращает поле XML при использовании предложения GROUP BY в MS SQL Management Studio?

lowFareResponse

В таблице иногда получает два lowFareRQ и lowFareRS, что считается только один сезон под BookingNumber. Затем бронирование обрабатывается в билет, в котором каждый номер бронирования всегда имеет тот же билет TicketRQ и TicketRS, если пользователь совершил бронирование. TicketRS содержит ссылочный номер третьей стороны.

Теперь я хочу отобразить все активные заказы для пользователя, чтобы позволить пользователю отменить бронирование, если захочет.

Таким образом, я хотел бы получить каждый номер бронирования с активным статусом, а также данные TicketRS xml, чтобы получить ссылочный номер третьей стороны.

Вот SQL-запрос я начал с:

SELECT TOP 100 
    [BookingNumber] 
    ,[Status] 
    ,[TicketRS] 
FROM [VTResDB].[dbo].[LowFareRS] 
GROUP BY [BookingNumber],[Status],[TicketRS] 
ORDER BY [recID] desc 

Теперь с MS SQL Management Studio вы должны добавить поле [TicketRS] для «GROUP BY», если вы хотите иметь его в «SELECT 'список полей ... но вы не можете иметь поле XML в списке «GROUP BY».

Я знаю, что если изменить структуру таблицы, эта проблема может быть решена без каких-либо проблем, но я хочу избежать изменения структуры таблицы, потому что я просто завершаю программное обеспечение и не хочу переписывать существующий код.

Есть ли способ вернуть поле XML при использовании предложения GROUP BY в MS SQL Management Studio?

+0

Пожалуйста, не судите меня за вкладку le design, потому что я сам его не создал - смешение верхнего и нижнего верблюжьего корпуса, используя «Status» в качестве имени поля и не нормализуя там, где это было необходимо. – Nightwolf

ответ

1

Гм, это, кажется, грязный ... Если XMLs тождественно в группе, вы можете попробовать что-то вроде этого:

DECLARE @tbl TABLE(ID INT IDENTITY,Col1 VARCHAR(100),SomeValue INT,SomeXML XML); 
INSERT INTO @tbl(col1,SomeValue,SomeXML) VALUES 
('testA',1,'<root><a>testA</a></root>') 
,('testA',2,'<root><a>testA</a></root>') 
,('testB',3,'<root><a>testB</a></root>') 
,('testB',4,'<root><a>testB</a></root>'); 

WITH GroupedSource AS 
(
    SELECT SUM(SomeValue) AS SumColumn 
      ,CAST(SomeXml AS NVARCHAR(MAX)) AS XmlColumn 
    FROM @tbl AS tbl 
    GROUP BY Col1,CAST(SomeXml AS NVARCHAR(MAX)) 
) 
SELECT SumColumn 
     ,CAST(XmlColumn AS XML) AS ReCasted 
FROM GroupedSource 

Другой подход заключается в том, что это

WITH GroupedSource AS 
(
    SELECT SUM(SomeValue) AS SumColumn 
      ,MIN(ID) AS FirstID 
    FROM @tbl AS tbl 
    GROUP BY Col1 
) 
SELECT SumColumn 
     ,(SELECT SomeXML FROM @tbl WHERE ID=FirstID) AS ReTaken 
FROM GroupedSource 
+0

Учитывая, что вашему решению нужен суб-запрос, он по-прежнему не оптимален для производительности. На данный момент я просто использую код для гнездования запросов (я знаю еще хуже), так что я могу заставить его работать до перезаписи (никогда в бизнес-условиях). – Nightwolf

+0

@Nightwolf, если есть идексированный ключ, второй подход должен работать неплохо ... Кастинг взад и вперед - наверняка - больше накладных расходов ... – Shnugo

0

В ролях его nvarchar(max) и обратно

with t(xc,val) as (
    select xc=cast(N'<x><y>txt</y></x>' as xml), val = 5 
    union all  
    select xc=cast(N'<x><y>txt</y></x>' as xml), val = 6 
) 
select xc = cast(xc as XML), val 
from (
    select xc = cast(xc as nvarchar(max)), val = sum(val) 
    from t 
    group by cast(xc as nvarchar(max)) 
    ) tt 
;