2013-08-12 2 views
1

Верхний запрос выглядит в таблице, в которой будет только одна запись для каждого оператора, поэтому, если у клиента есть 7 операторов, количество строк должно быть 7, и запрос будет перечислять их например, 1,2,3,4,5,6,7Использование выделенного внутри пути xml без включения в select

Нижний запрос выглядит в таблице, которая будет иметь 7 операторов, как указано выше, но чаще всего они будут разделены, поэтому, если есть 2 строки для каждого заявления были бы 14, то есть 1,1,2,2,3,3,4,4,5,5,6,6,7,7

Теперь, что я пытаюсь достижение - это следующее: верхний запрос в порядке, но нижний запрос нужно сделать отличным. Посмотрите на результат № 2 на нижнем изображении, я хочу, чтобы это возвращалось как 1,2,3,4,5,6,7,8,9,10.

Если был конкретный случай, когда заявления поднялись до 8 и 4 соответственно, я бы хотел 1,2,3,4,5,6,7,8. В основном, это в большинстве случаев дублирует номера операторов для нижнего запроса, и я хотел бы, чтобы он просто делал отчетливый сквозной результат целиком, однако я попытался поместить в него отчет, и он жалуется, что порядок по элементам должен содержаться в выборе если он содержится в отдельном, это разрушает мой запрос.

Конечная цель этих двух запросов является сравнение верхнего набора результатов на дно и вернуть только те, которые Dont матч (как это будет означать, я пропускаю заявление в столешнице запросов)

--Shows the each consolidated statement number that exisits for that particular customer reference number within the dbo.rss table. 

Select Main.cust_ref, 
     Left(CAST(Main.consolidatedstatements as varchar(max)),Len(CAST(Main.consolidatedstatements as varchar(max)))-1) As "consolidatedstatements" 
From(Select distinct ST2.cust_ref, 
      (Select CAST(ST1.consolidated_stmt_num as varchar(max)) + ',' AS [text()] 
      From dbo.rss ST1 
      Where ST1.cust_ref = ST2.cust_ref 
      ORDER BY ST1.cust_ref 
      For XML PATH ('')) [consolidatedstatements] 
    From dbo.rss ST2) [Main] 


--Shows the each consolidated statement number that exisits for that particular customer reference number within the dbo.SC table. 
Select Main.cust_ref, 
     Left(CAST(Main.consolidatedstatements as varchar(max)),Len(CAST(Main.consolidatedstatements as varchar(max)))-1) As "consolidatedstatements" 
From(Select distinct ST2.cust_ref, 
      (Select CAST(ST1.consolidated_stmt_num as varchar(max)) + ',' AS [text()] 
      From dbo.SC ST1 
      Where ST1.cust_ref = ST2.cust_ref 
      ORDER BY ST1.cust_ref 
      For XML PATH ('')) [consolidatedstatements] 
    From dbo.SC ST2) [Main] 

enter image description here

+1

Почему вы не выполняете соединение первым и не делаете группу там, а затем выполняете конкатенацию XML PATH по результатам? Или просто используйте EXCEPT для поиска отсутствующих команд вместо сравнения конкатенаций на основе строк? –

+0

Если это для сравнения строк, то есть лучшие способы, чем групповая конкатенация. Во всяком случае, вы можете использовать CTE, где вы выбираете разные значения 'консолидированный_stmt_num' вместо' dbo.SC'. – Lamak

+0

@AaronBertrand Извините, я не уверен, что вы имеете в виду, можете ли вы опубликовать некоторый SQL, чтобы показать мне. Спасибо за ваш ответ. – JsonStatham

ответ

2
CREATE TABLE #rss(cust_ref VARCHAR(32), consolidated_stmt_num INT); 

CREATE TABLE #SC(cust_ref VARCHAR(32), consolidated_stmt_num INT); 

INSERT #SC VALUES 
('A',1),('A',2),('A',3),('A',4),('A',5),('A',6),('A',7),('A',8),('A',9), 
('B',1),('B',2),('B',3),('B',4),('B',5),('B',6),('B',7),('B',8),('B',9), 
('C',1),('C',2),('C',3),('C',4),('C',5),('C',6),('C',7),('C',8),('C',9); 

-- missing A,7 and C,2/C,4: 
INSERT #rss VALUES 
('A',1),('A',2),('A',3),('A',4),('A',5),('A',6),  ('A',8),('A',9), 
('B',1),('B',2),('B',3),('B',4),('B',5),('B',6),('B',7),('B',8),('B',9), 
('C',1),  ('C',3),  ('C',5),('C',6),('C',7),('C',8),('C',9); 

GO 

- Это сам по себе скажет вам cust_refs с отсутствующим заявлением (и какие из них они):

SELECT cust_ref, consolidated_stmt_num FROM #SC 
EXCEPT 
SELECT cust_ref, consolidated_stmt_num FROM #rss; 

- Это позволит вам получить полный каскадный список из каждой таблицы, в одной строке:

;WITH x AS 
(
    SELECT DISTINCT cust_ref FROM 
    (
    SELECT cust_ref, consolidated_stmt_num FROM #SC 
    EXCEPT 
    SELECT cust_ref, consolidated_stmt_num FROM #rss 
) AS y 
) 
SELECT x.cust_ref, 
    rss = STUFF((SELECT ',' + CONVERT(VARCHAR(12), r.consolidated_stmt_num) 
     FROM #rss AS r WHERE r.cust_ref = x.cust_ref 
     ORDER BY r.cust_ref 
    FOR XML PATH(''), TYPE).value('.[1]','varchar(max)'),1,1,''), 
    sc = STUFF((SELECT ',' + CONVERT(VARCHAR(12), s.consolidated_stmt_num) 
     FROM #SC AS s WHERE s.cust_ref = x.cust_ref 
     ORDER BY s.cust_ref 
    FOR XML PATH(''), TYPE).value('.[1]','varchar(max)'),1,1,'') 
FROM x; 

- если вам нужно их на отдельных строках:

;WITH x AS 
(
    SELECT DISTINCT cust_ref FROM 
    (
    SELECT cust_ref, consolidated_stmt_num FROM #SC 
    EXCEPT 
    SELECT cust_ref, consolidated_stmt_num FROM #rss 
) AS y 
) 
SELECT x.cust_ref, source = 'rss', 
    list = STUFF((SELECT ',' + CONVERT(VARCHAR(12), r.consolidated_stmt_num) 
     FROM #rss AS r WHERE r.cust_ref = x.cust_ref 
     ORDER BY r.cust_ref 
    FOR XML PATH(''), TYPE).value('.[1]','varchar(max)'),1,1,'') 
    FROM x 
UNION ALL SELECT x.cust_ref, 'sc', 
    list = STUFF((SELECT ',' + CONVERT(VARCHAR(12), s.consolidated_stmt_num) 
     FROM #SC AS s WHERE s.cust_ref = x.cust_ref 
     ORDER BY s.cust_ref 
    FOR XML PATH(''), TYPE).value('.[1]','varchar(max)'),1,1,'') 
    FROM x 
ORDER BY cust_ref, source; 

- очистка:

DROP TABLE #rss, #SC; 
+0

Спасибо Aaron, первый запрос EXCEPT позволил мне выполнить то, что мне было нужно, остальное было хорошо иметь ссылку на хотя. Спасибо за те усилия, которые вы пошли в ответ, очень цените! – JsonStatham