2012-04-08 2 views
1

Можно создать дубликат:
Simulating group_concat MySQL function in MS SQL Server 2005?
SQL Query for aggregation/concatenationКак заполнять дубликаты записей на SQL-сервере?

Я пытаюсь использовать функцию вещи в сервере SQL набивать определенную информацию. Вот пример:

Money  Age Gender 
860  9   F 
860  15   M 
860  15   M 
860  16   M 
860  16   F 

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

Money Age     Gender 
860  9, 15, 15, 16, 16 F, M, M, M, F 

Пожалуйста, обратите внимание, что я хотел бы сохранить два 15s и три М в возрасте и роде, соответственно.

ответ

1

Это проще сделать, используя XML, а не материал. Имейте в виду, что предложение FORM XML может быть обмануто для создания разделенного запятой списка (CSV).

Приведенный ниже пример должен делать именно то, о чем вы просите.

CREATE TABLE moneyagegender 
( 
[Money] INT, 
[Age] INT, 
[Gender] VARCHAR(2) 
); 

INSERT INTO moneyagegender 
VALUES  (860, 9, 'F'), 
     (860, 15, 'M'), 
     (860, 15, 'M'), 
     (860, 16, 'M'), 
     (860, 16, 'F'); 

SELECT mag.money, 
    (SELECT Substring((SELECT ', ' + CAST(m2.age AS VARCHAR(1024)) 
         FROM moneyagegender m2 
         WHERE m2.money = mag.money 
         ORDER BY m2.age 
         FOR XML PATH('')), 3, 10000000) AS list) AS ages, 
    (SELECT Substring((SELECT ', ' + m3.gender 
         FROM moneyagegender m3 
         WHERE m3.money = mag.money 
         ORDER BY m3.age 
         FOR XML PATH('')), 3, 10000000) AS list) AS genders 
FROM moneyagegender mag 
GROUP BY mag.money; 

и вот выход.

Money  Ages     Genders 
----------- -------------------- ----------------- 
860   9, 15, 15, 16, 16 F, M, M, M, F 
(1 row(s) affected) 

Надеюсь, это поможет.

Если вам нужна дополнительная информация, у меня есть запись в блоге из прошлого года, которая объясняет это. http://stevestedman.com/2011/10/converting-part-of-a-result-set-to-a-comma-separated-list/

+0

В [вопросе] (http://stackoverflow.com/questions/7896239/sql-query-for-aggregation-concatenation) Я связался с [Джо Стефанелли] (http://stackoverflow.com/users/341251/joe-stefanelli) объясняет, что 'STUFF' используется только для удаления нежелательного первого разделителя (гораздо более чистым способом, чем' substring (, 3,10000000) '. – GSerg

+0

@ Стив и GSerg оба ответа отлично работали. спасибо! –

+0

@ Стив, предположим, что у меня есть несколько столбцов (в этом случае пусть говорит дата, время, место, магазин, а затем столбец «Деньги», который был оригинальным из этого скрипта, будет ли он работать? –