2015-08-18 1 views
2

У меня есть следующий запрос, который я использую для отчета SSRS:Сортировка данных перед тем конкатенации с помощью STUFF FOR XML

SELECT ROW_NUMBER() OVER (ORDER BY Judge.EventJudgeID) AS JudgeRow , 
     Judge.EventID , 
     Judge.Judge_PersonID , 
     STUFF((SELECT DISTINCT 
         ',' + CAST(Fights.FightNumber AS VARCHAR(MAX)) AS [text()] 
       FROM dbo.tblFights Fights , 
         dbo.tblFightJudge FRJudge 
       WHERE Fights.FightID = FRJudge.fightid 
         AND (Judge.Judge_PersonID = FRJudge.judge1id 
           OR Judge.Judge_PersonID = FRJudge.judge2id 
           OR Judge.Judge_PersonID = FRJudge.judge3id 
          ) 
       FOR 
       XML PATH('') 
      ), 1, 1, '') AS BoutsJudged , 
     Persons.LastName + ' ' + Persons.FirstName AS JudgeName , 
     Events.EventName , 
     Events.EventDate 
FROM dbo.tblEventJudge Judge 
     INNER JOIN dbo.tblPersons Persons ON PersonID = Judge_PersonID 
     INNER JOIN dbo.tblEvents Events ON Events.EventID = Judge.EventID 
WHERE Judge.EventID = 1278; 

Проблема заключается в том, что команда STUFF возвращает следующую строку:

1, 10,11,12,13,14,15,16,17,18,19,2,3,4,5,6,7,8,9

Как я могу сортировать цифры перед их конкатенацией в строку?

ответ

2

Попробуйте

SELECT ROW_NUMBER() OVER (ORDER BY Judge.EventJudgeID) AS JudgeRow , 
     Judge.EventID , 
     Judge.Judge_PersonID , 
     STUFF(Select ',' + CAST(Fights.FightNumber AS VARCHAR(MAX)) AS [text()] From (SELECT DISTINCT Fights.FightNumber 
       FROM dbo.tblFights Fights , 
         dbo.tblFightJudge FRJudge 
       WHERE Fights.FightID = FRJudge.fightid 
         AND (Judge.Judge_PersonID = FRJudge.judge1id 
           OR Judge.Judge_PersonID = FRJudge.judge2id 
           OR Judge.Judge_PersonID = FRJudge.judge3id 
          ) 
        ) X 
      ORDER BY Fights.FightNumber 
      FOR 
       XML PATH('') 
      ), 1, 1, '') AS BoutsJudged , 
     Persons.LastName + ' ' + Persons.FirstName AS JudgeName , 
     Events.EventName , 
     Events.EventDate 
FROM dbo.tblEventJudge Judge 
     INNER JOIN dbo.tblPersons Persons ON PersonID = Judge_PersonID 
     INNER JOIN dbo.tblEvents Events ON Events.EventID = Judge.EventID 
WHERE Judge.EventID = 1278; 

Вы можете проверить ниже SQLs,

До:

Select *, 
     STUFF((Select Distinct ','+Cast(high as varchar(MAX)) 
       from master..spt_values where type = 'p' and number < 20 
       for xml Path('')),1,1,'') 
from master..spt_values where type = 'p' and number < 20 

После:

Select *, 
      STUFF((Select ','+Cast(high as varchar(MAX)) from (Select distinct  high 
    from master..spt_values where type = 'p' and number < 20) x Order by high for xml Path('')),1,1,'') 
    from master..spt_values where type = 'p' and number < 20 
+0

Я попытался, что, к сожалению, возвращающая следующая erro r: Msg 145, Level 15, State 1, Line 1 Элементы ORDER BY должны быть указаны в списке выбора, если указан параметр SELECT DISTINCT. Поэтому я попытался упорядочить с помощью [text()], который не работает, потому что он упорядочивает созданную строку, которая возвращает тот же результат, что и в исходном вопросе. – BigDevJames

+0

Как насчет ** ORDER BY CAST (Fights.FightNumber AS VARCHAR (MAX)) **? –

+0

Я отредактировал приведенный выше код, попробуйте. сначала я делаю разные, а затем обертываю его другим sql. Поскольку у меня нет данных, я не могу проверить это, дайте мне знать, если это сработает. – Sagar

0

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

USE MASTER; SELECT TOP 3 TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS; 
/*TABLE_NAME  COLUMN_NAME   ORDINAL_POSITION 
spt_fallback_db xserver_name  1 
spt_fallback_db xdttm_ins   2 
spt_fallback_db xdttm_last_ins_upd 3 
*/ 

Теперь, ломая этот подход (для сортировки списка в пределах столбца) ...
(1) Добавление FOR XML PATH (» «) для запроса в 1 колонку вращает его в один ряд, но добавляет XML-тег для заголовка столбца ...

SELECT TOP 3 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS FOR XML PATH(''); 
/*<COLUMN_NAME>xserver_name</COLUMN_NAME><COLUMN_NAME>xdttm_ins</COLUMN_NAME><COLUMN_NAME>xdttm_last_ins_upd</COLUMN_NAME>*/ 

(2) Concatination аннулирует заголовок столбца, устранение меток. Любая строка будет работать, я хочу запятая пространство ...

SELECT TOP 3 ', ' + COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS FOR XML PATH(''); 
/*, xserver_name, xdttm_ins, xdttm_last_ins_upd*/ 

(3) Другие столбцы будут нужны свои собственные SELECT, поэтому FOR XML должен быть подзапрос и ORDER BY является юридическим Приставка в FOR XML подзапрос;) ...

SELECT TOP 2 TABLE_NAME 
     , (SELECT ', ' + COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
       WHERE COLUMNS.TABLE_NAME = TABLES.TABLE_NAME 
      ORDER BY ORDINAL_POSITION FOR XML PATH('') 
     ) LIST_OF_COLUMNS 
    FROM INFORMATION_SCHEMA.TABLES 
ORDER BY TABLE_NAME; 
/*TABLE_NAME  LIST_OF_COLUMNS 
spt_fallback_db , xserver_name, xdttm_ins, xdttm_last_ins_upd, xfallback_dbid, name, dbid, status, version 
spt_fallback_dev , xserver_name, xdttm_ins, xdttm_last_ins_upd, xfallback_low, xfallback_drive, low, high, status, name, phyname 
*/ 

(4) Наконец, SUBSTRING более знакома мне, чем STUFF для удаления известного префикса ...

SELECT TOP 2 TABLE_NAME 
     , SUBSTRING((SELECT ', ' + COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
         WHERE COLUMNS.TABLE_NAME = TABLES.TABLE_NAME 
         ORDER BY ORDINAL_POSITION FOR XML PATH('') 
         ) 
        , 2+1--Add 1 to start substring after the first 2 characters 
        , 99999) LIST_OF_COLUMNS 
    FROM INFORMATION_SCHEMA.TABLES 
ORDER BY TABLE_NAME; 
/*TABLE_NAME  LIST_OF_COLUMNS 
spt_fallback_db xserver_name, xdttm_ins, xdttm_last_ins_upd, xfallback_dbid, name, dbid, status, version 
spt_fallback_dev xserver_name, xdttm_ins, xdttm_last_ins_upd, xfallback_low, xfallback_drive, low, high, status, name, phyname 
*/ 

Pedantically yours - Jim Gettman

Смежные вопросы