sql разделенный запятыми список столбцов в аналитической функции - PullRequest
0 голосов
/ 07 февраля 2012

Я использую SQL Server 2008, и мне нужно составить общий список столбцов с разделителями.Я знаю, как это сделать, но мне нужно это время, пока я использую аналитическую функцию, я имею в виду, что я не хочу использовать предложение group by.Так как я также выберу записи во внешнем запросе ", где row_num = 1 "

Вот запрос:

SELECT UserId
      ,ProductList
      ,Value
  FROM
  (
SELECT p.UserId 
     ,p.Value
     , ROW_NUMBER()OVER (PARTITION BY p.UserId ORDER BY p.RecordCreateDate asc) AS 'row_num'
     --here I need a solution  OVER (PARTITION BY p.UserId) AS 'ProductList'
  FROM Products p
       INNER JOIN
       Users u
       ON p.UserId = u.Id
       ) result
 WHERE result.row_num = 1

Данные пользователей:

Id       Name      ....
 1       John
 2       Anton
 3       Craig

Данные о продукции:

Id      UserId      Name     RecordCreateDate   Value
 1           1         a           21.12.2012      10
 2           1         b           11.12.2012      20
 3           1         c           01.12.2012      30
 4           2         e           05.12.2012      40
 5           2         f           17.12.2012      50
 6           3         d           21.12.2012      60 
 7           3         i           31.12.2012      70

Мне нужен такой результат, как:

UserId     ProductList      Value
     1           a,b,c         30
     2             e,f         40
     3             d,i         60

Спасибо за вашу помощь

Ответы [ 3 ]

3 голосов
/ 07 февраля 2012

Так как вы собираетесь фильтровать по row_num = 1, вам нужно поместить свой запрос в CTE или тому подобное, где вы добавляете дополнительные столбцы из Продуктов. Затем вы можете построить строку, разделенную запятыми, во внешнем запросе с помощью трюка для пути XML без использования group by.

;WITH C as
(
  SELECT p.UserId 
       , ROW_NUMBER()OVER (PARTITION BY p.UserId ORDER BY p.RecordCreateDate asc) AS 'row_num'
       --, Some other fields from Products
    FROM Products p
         INNER JOIN
         Users u
         ON p.UserId = u.Id
)
SELECT UserId,
       --, Some other fields from Products
       --, Build the concatenated list here using for xml path()
FROM C
WHERE C.row_num = 1 
1 голос
/ 07 февраля 2012

Просто для полноты.Удалите символы # для вашего фактического решения.

SET NOCOUNT ON;

CREATE TABLE #users
(
    Id INT,
    Name VARCHAR(32)
);

INSERT #users VALUES
(1,'John'),
(2,'Anton'),
(3,'Craig');

CREATE TABLE #products
(
    Id INT,
    UserId INT,
    Name VARCHAR(32),
    RecordCreateDate DATE,
    Value INT
);

INSERT #products VALUES
(1,1,'a','2012-12-21',10),
(2,1,'b','2012-12-11',20),
(3,1,'c','2012-12-01',30),
(4,2,'e','2012-12-05',40),
(5,2,'f','2012-12-17',50),
(6,3,'d','2012-12-21',60), 
(7,3,'i','2012-12-31',70);

Запрос:

;WITH x AS 
(
    SELECT UserId, Value, 
        row_num = ROW_NUMBER() OVER 
        (
              PARTITION BY UserId 
              ORDER BY RecordCreateDate
        )
        FROM #products
)
SELECT
  x.UserId,
  u.Name,
  ProductList = STUFF((
     SELECT ',' + Name
        FROM #Products AS p 
        WHERE p.UserId = x.UserId 
        FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1,''),
  x.Value
FROM x
INNER JOIN #users AS u
ON x.UserId = u.Id
WHERE x.row_num = 1;

Затем очистите:

DROP TABLE #users, #products;

Результаты:

UserId  Name    ProductList  Value
1       John    a,b,c        30
2       Anton   e,f          40
3       Craig   d,i          60
1 голос
/ 07 февраля 2012

Я не уверен, что вы спрашиваете в начале, но это даст вам запрошенный вывод

SELECT UserId,
  STUFF((SELECT ',' + ProductName from Products p WHERE p.UserID = u.UserID FOR XML PATH('')), 1, 1, '') as ProductList
FROM Users u
...