reed_s Ответов: 2

Как поместить разные значения для одного и того же поля в строку


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

Что я уже пробовал:

ВЫБИРАТЬ
идентификатор пользователя
,(Выберите комментарии
Где Subject = 'Comment1 комментарий'
) Как Comment1
,(Выберите CmEvent.Комментарии
Где Subject = 'Comment2 комментарий'
) Как Comment2
,(Выберите CmEvent.Комментарии
Где Subject = 'Comment3 Comment'
) А Comment3
Из таблицы 1(NOLOCK)
ГДЕ ID = 1

2 Ответов

Рейтинг:
8

Santosh kumar Pithani

CREATE TABLE #temp( Id INT,Comments NVARCHAR(50), CommentText NVARCHAR(1000));
INSERT INTO #temp (Id,Comments, CommentText)
VALUES (1,'Comment1', 'My Initial Entry')
      ,(2,'Comment2','My Second Entry')
      ,(1,'Comment3','Your third Entry')
      ,(1,'Comment4','Your Last Entry');

DECLARE @pivtcols VARCHAR(MAX),@Query NVARCHAR(MAX);

SELECT @pivtcols=STUFF((SELECT DISTINCT ','+QUOTENAME(Comments) FROM #temp where ID=1 FOR XML PATH('')),1,1,'');

 SET @Query=N'SELECT * FROM #TEMP PIVOT(MAX(CommentText) FOR Comments IN('+@pivtcols+'))As pvt WHERE ID=1';

 EXEC(@Query);

 DROP TABLE #temp;

 --OUTPUT:-
 -----------------------------------------------------
Id |	Comment1	   |      Comment3	  |        Comment4
---------------------------------------------------------
1	My Initial Entry	Your third Entry	Your Last Entry


Рейтинг:
13

MadMyche

Ваш лучший метод будет заключаться в том, чтобы разбить данные (нормализация) в отдельные таблицы для пользователей и комментариев.

DECLARE @Users TABLE (
  UserID INT PRIMARY KEY NOT NULL
, UserName VARCHAR(100)
)

DECLARE @Comments TABLE (
  CommentID INT PRIMARY KEY NOT NULL
, UserID INT NULL
, CommentTime DATETIME NULL
, CommentSubject NVARCHAR(100) NULL
, CommentText NVARCHAR(1000) NULL
)

INSERT @Users (UserID, UserName)
VALUES (1, 'Me')
,      (2, 'You')

INSERT @Comments (CommentID, UserID, CommentTime, CommentSubject, CommentText)
VALUES (1, 1, GetDate(), 'Comment1', 'My Initial Entry')
,      (2, 1, GetDate(), 'Comment2','My Second Entry')
,      (3, 2, GetDate(), 'Comment1','Your First Entry')
,      (4, 2, GetDate(), 'Comment2','Your Last Entry')


И оттуда вы можете либо присоединиться к столам
SELECT u.UserName, c.CommentTime, c.CommentText
FROM   @Users        u
INNER JOIN @Comments c ON u.UserID = c.UserID
WHERE  u.UserID = 1
который возвращается
UserName     CommentTime     CommentText
--------     -----------     ------------
Me           2018-08-22      Initial Entry
Me           2018-08-22      Second Entry


Или вы могли бы использовать СТЕРЖЕНЬ чтобы получить несколько столбцов комментариев
; WITH cte AS (
  SELECT  u.UserID, u.UserName, c.CommentTime, c.CommentText, c.CommentSubject
  FROM   @Users        u
  INNER JOIN @Comments c ON u.UserID = c.UserID
)

SELECT  UserName, y.Comment1, y.Comment2 
FROM   cte
PIVOT (
  Max(CommentText)
  FOR CommentSubject IN ([Comment1], [Comment2] )
) as y

WHERE UserID = 1
который вернет это
UserName  Comment1          Comment2
--------  ---------------   ----------------
Me        My Initial Entry  My Second Entry