amitesh1989 Ответов: 2

Как извлечь значение из базы данных только через запятую для избыточных данных в C#


Привет кодер,

У меня есть таблица, в которой у меня есть столбцы

Навык ДПС
Х
X B
Г с
Г Д

как получить данные в

Навык ДПС
X A,B
Y C, D

И храните их в DataTable в c# я ищу немного кода, но это не соответствует моим требованиям, любая помощь будет оценена по достоинству.

заранее спасибо.

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

До сих пор я пытался

StringBuilder skills = new StringBuilder();
                    for (int i = 0; i < dtSkills.Rows.Count; i++)
                    {
                        for (int j = 0; j < dtSkills.Rows.Count; j++)
                        {
                            if (dtSkills.Rows[i]["DemandPrimarySkill"].ToString().Equals(dtSkills.Rows[j]["DemandPrimarySkill"].ToString()))
                            {
                                if (dtSkills.Rows[i]["Skill"].ToString().ToUpper().Trim().Equals(dtSkills.Rows[j]["Skill"].ToString().ToUpper().Trim()))
                                {
                                    if (!String.IsNullOrEmpty(skills.ToString()))
                                    {
                                        skills.Append(",");
                                    }
                                    skills.Append(dtSkills.Rows[j]["Skill"].ToString());
                                }
                            }
                            else
                            {
                                break;
                            }

                        }

           }


в этом у меня есть dtSkill, в котором у меня есть все DPS и связанные с этим DPS у меня есть навыки, которые я пытаюсь добавить навык с помощью string builder, но не получил того, что хотел.

2 Ответов

Рейтинг:
1

Suvendu Shekhar Giri

Такого результата можно добиться с помощью STUFF()
Проверьте следующий пример-

DECLARE @tbl AS TABLE(DPS VARCHAR(10),Skill VARCHAR(10))
INSERT INTO @tbl
SELECT 'X','A'
UNION ALL
SELECT 'X','B'
UNION ALL
SELECT 'Y','C'
UNION ALL
SELECT 'Y','D'


SELECT DPS,
STUFF((SELECT ', ' + A.Skill FROM @tbl A
WHERE A.DPS=B.DPS FOR XML PATH('')),1,1,'') AS [Skill]
From @tbl B
GROUP BY DPS


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


amitesh1989

@suvendu-эта таблица-всего лишь пример их 1000 данных в таблице в БД. база данных уже создана, мне просто нужно извлечь данные из нее и сохранить их в Datatable или как я могу использовать команду declare в коде позади.

Richard Deeming

Если какое-либо из значений в Skill столбец содержит "специальные" символы, они будут закодированы в XML-кодировке на выходе.

Вы можете обойти это с помощью FOR XML PATH(''), TYPE, а затем добавляя .value('.', 'varchar(max)') перед запятой. Анит Сен опубликовала подробный обзор различных вариантов еще в 2008 году:
Конкатенация значений строк в Transact-SQL[^]

Рейтинг:
1

0x01AA

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

DemoTable:

CREATE TABLE Demo 
(
  DPS CHAR(30),
  SKILL CHAR(30)
);


Тестовые Данные:
INSERT INTO Demo (DPS, SKILL) VALUES
('X', 'A'),
('X', 'B'),
('Y', 'C'),
('Y', 'D');


Тестовый SQL:
SELECT  DPS,
        SKILLVALS= STUFF((SELECT RTRIM(SKILL) + ','
                          FROM Demo D2
                          WHERE D2.DPS = D1.DPS
                          ORDER BY D2.SKILL
                          FOR XML PATH('')), 1, 0, '')
FROM Demo D1
GROUP BY D1.DPS
ORDER BY D1.DPSS


результат испытания:
DPS  SKILLVALS
---  ---------
X    A,B,
Y    C,D,


Небольшой недостаток:", " в конце SKILLVALS.

И нет, я не нашел этого решения, изучив документацию MSDN :)
Здесь вы найдете всю необходимую информацию: Групповая конкатенация SQL Server - SQLPerformance.com[^], найдите там "FOR XML PATH".

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

[Редактировать] Благодаря Ричард Считая - Профессионального Профиля[^], см. его комментарий к приведенному выше решению.
SELECT DPS,
       SKILLVALS= STUFF((SELECT ',' + RTRIM(SKILL) 
                         FROM Demo D2
                         WHERE D2.DPS = D1.DPS
                         ORDER BY D2.SKILL
                         FOR XML PATH('')), 1, 1, '')
FROM Demo D1
GROUP BY D1.DPS
ORDER BY D1.DPS


В итоге без начальных и конечных ',':
DPS  SKILLVALS
---  ---------
X    A,B
Y    C,D


Richard Deeming

Если вы переместите запятую перед именем столбца и измените STUFF аргументы от 1, 0, '' к 1, 1, '', тогда у вас не будет ни ведущей, ни конечной запятой.

Однако это фактически идентично решению 1.

0x01AA

Ух ты, здорово! Большое спасибо.