SQL-запрос конкатенации строк в столбце из нескольких строк - PullRequest
0 голосов
/ 14 мая 2018

У меня есть таблица e как

eId FName LName Type  SubType
  1  a     aa    1    S11a
  1  a     aa    1    S12a
  1  a     aa    1    S13a
  1  a     aa    3    S31a
  1  a     aa    3    S32a
  2  b     bb    1    S11b
  2  b     bb    1    S12b
  2  b     bb    3    S31b
  2  b     bb    3    S32b

Я хочу получить такую ​​таблицу

eId    FName   LName   SubType1         SubType2
1       a       aa     S11a;S12a;S13a   S31a;S32a
2       b       bb     S11b;S12b         S31b;S32b

Другими словами, я хочу запустить SQL-запрос, который дает мне группу подтиповсотрудниками, как два столбца для типа 1 и типа 2. Я пытаюсь работать с командой STUFF в SQL-запросе, но не удалось.Это запрос, который я написал, но он не работает.В основном это дает мне нулевые значения для столбцов SubType.

    SELECT e1.eId, e1.FName, e1.LName
, STUFF((
        SELECT N'; ' + [SubType]
        FROM e e2
        WHERE e1.eId = e2.eId 
            AND e1.FName = e2.FName 
            AND e1.LName = e2.LName         
            AND e1.[Type] = e2.[Type]           
            AND e1.[Type] = 1
        FOR XML PATH ('')), 1, 2, '') AS SubType1

, STUFF((
        SELECT N'; ' + [SubType]
        FROM e e2
        WHERE e1.eId = e2.eId 
            AND e1.FName = e2.FName 
            AND e1.LName = e2.LName         
            AND e1.[Type] = e2.[Type]           
            AND e1.[Type] = 3
        FOR XML PATH ('')), 1, 2, '') AS SubType2 
FROM e e1
GROUP BY e1.eId, e1.FirstName, e1.LastName, e1.[Type]

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

В вашем запросе несколько вопросов.

1 - имя столбца, которое вы используете, неверно, в вашем выборе вы используете FName и LName и Group by вы используете FirstName и LastName.

2- EmployeeId столбец eId, в одном месте вы поете eId и другое место, которое вы используете EmployeeId

3- Type не выбран, он не может быть частью group by.

Следующий запрос должен работать.

SELECT e1.eId, e1.FName, e1.LName,
       STUFF((SELECT N'; ' + [SubType]
              FROM e e2
              WHERE e1.[eId] = e2.[eId] AND
                    e2.[Type] = 1
              FOR XML PATH ('')
             ), 1, 2, '') AS SubType1,
       STUFF((SELECT N'; ' + [SubType]
              FROM e e2
              WHERE e1.[eId] = e2.[eId] AND
                    e2.[Type] = 3
              FOR XML PATH ('')
             ), 1, 2, '') AS SubType1
FROM e e1
GROUP BY e1.eId, e1.FName, e1.LName;

DEMO

Edit:

Вы также можете попробовать выполнить следующее, это четко разделит группу по вашим подзапросам.

SELECT *,
 STUFF((SELECT N'; ' + [SubType]
              FROM e e2
              WHERE e3.[eId] = e2.[eId] AND
                    e2.[Type] = 1
              FOR XML PATH ('')
             ), 1, 2, '') AS SubType1,
       STUFF((SELECT N'; ' + [SubType]
              FROM e e2
              WHERE e3.[eId] = e2.[eId] AND
                    e2.[Type] = 3
              FOR XML PATH ('')
             ), 1, 2, '') AS SubType1
FROM
(
  SELECT e1.eId, e1.FName, e1.LName   
  FROM e e1
  GROUP BY e1.eId, e1.FName, e1.LName
)e3
0 голосов
/ 14 мая 2018

Попробуйте это ...

Скрипт таблицы и пример данных

CREATE TABLE [TableName](
    [eId] [int] NULL,
    [FName] [nvarchar](50) NULL,
    [LName] [nvarchar](50) NULL,
    [Type] [int] NULL,
    [SubType] [nvarchar](50) NULL
)

INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (1, N'a', N'aa', 1, N'S11a')
INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (1, N'a', N'aa', 1, N'S12a')
INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (1, N'a', N'aa', 1, N'S13a')
INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (1, N'a', N'aa', 3, N'S31a')
INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (1, N'a', N'aa', 3, N'S32a')
INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (2, N'b', N'bb', 1, N'S11b')
INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (2, N'b', N'bb', 1, N'S12b')
INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (2, N'b', N'bb', 3, N'S31b')
INSERT [TableName] ([eId], [FName], [LName], [Type], [SubType]) VALUES (2, N'b', N'bb', 3, N'S32b')

Запрос (с использованием функции PIVOT)

SELECT eid, 
       fname, 
       lname, 
       [1] AS SubType1, 
       [3] AS SubType2 

FROM   (SELECT eid, [type], Max(fname) AS FName, Max(lname) AS LName, 
               Stuff((SELECT '; ' + subtype 
                      FROM   tablename t2 
                      WHERE  t2.eid = t1.eid 
                             AND t2.[type] = t1.[type] 
                      FOR xml path('')), 1, 2, '') AS SubType 
        FROM   tablename t1 
        GROUP  BY eid, [type]) sq 
       PIVOT ( Max(subtype) 
             FOR [type] IN ([1], [3]) ) piv 

выход

+-----+-------+-------+------------------+------------+
| eid | fname | lname |     SubType1     |  SubType2  |
+-----+-------+-------+------------------+------------+
|   1 | a     | aa    | S11a; S12a; S13a | S31a; S32a |
|   2 | b     | bb    | S11b; S12b       | S31b; S32b |
+-----+-------+-------+------------------+------------+

Демо: http://www.sqlfiddle.com/#!18/1542b/3/0

0 голосов
/ 14 мая 2018

Хммм. group by . . . type является подозрительным. Возможно, это сработает:

SELECT e1.eId, e1.FName, e1.LName,
       STUFF((SELECT N'; ' + [SubType]
              FROM e e2
              WHERE e1.EmployeeId = e2.EmployeeId AND
                    e2.[Type] = 1
              FOR XML PATH ('')
             ), 1, 2, '') AS SubType1,
       STUFF((SELECT N'; ' + [SubType]
              FROM e e2
              WHERE e1.EmployeeId = e2.EmployeeId AND
                    e2.[Type] = 3
              FOR XML PATH ('')
             ), 1, 2, '') AS SubType1
FROM e e1
GROUP BY e1.eId, e1.FirstName, e1.LastName;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...