I got the solution in both C# and SQL, Is there any other way to get same output?
Which approach (sql or c#) should i use, if performance matters?
C#:
static void Main(string[] args)
{
DataTable dt = new DataTable("MyTable");
dt.Columns.Add(new DataColumn("Name"));
dt.Columns.Add(new DataColumn("Description"));
DataRow dr = dt.NewRow();
dr["Name"] = "AB";
dr["Description"] = "ABC";
dt.Rows.Add(dr);
DataRow dr1 = dt.NewRow();
dr1["Name"] = "AB";
dr1["Description"] = "ABCD";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["Name"] = "CD";
dr2["Description"] = "ABCD";
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3["Name"] = "AB";
dr3["Description"] = "ABCDF";
dt.Rows.Add(dr3);
DataRow dr4 = dt.NewRow();
dr4["Name"] = "BC";
dr4["Description"] = "ABCD";
dt.Rows.Add(dr4);
DataRow dr5 = dt.NewRow();
dr5["Name"] = "BC";
dr5["Description"] = "ABCDF";
dt.Rows.Add(dr5);
StringBuilder sb = new StringBuilder();
var grouped = from table in dt.AsEnumerable()
group table by new { DescriptionCol = table["Description"] } into groupby
select new
{
Value = groupby.Key,
ColumnValues = groupby
};
foreach (var key in grouped)
{
Console.WriteLine(key.Value.DescriptionCol);
Console.WriteLine("---------------------------");
int i = 1;
foreach (var columnValue in key.ColumnValues)
{
string comma = " , ";
string and = " and ";
if (i > 1 && i < key.ColumnValues.Count())
{
sb.Append(comma);
}
else if (i > 1 && i == key.ColumnValues.Count())
{
sb.Append(and);
}
sb.Append(columnValue["Name"].ToString());
i++;
}
Console.WriteLine(sb.ToString());
sb.Clear();
Console.WriteLine();
}
Console.ReadLine();
}
SQL:
create table myTable
(
Description nvarchar(100),
Name nvarchar(100)
)
insert into myTable values
('ABC','AB'),
('ABCD','AB'),
('ABCD','CD'),
('ABCD','BC'),
('ABCDF','BC'),
('ABCDF','AB')
create table myTable1
(
Description nvarchar(100),
Name nvarchar(100)
)
insert into mytable1 (Description, Name)
SELECT Description, Name = STUFF((SELECT ', ' + Name
FROM myTable AS t2 WHERE t2.Description = t.Description
ORDER BY Description
FOR XML PATH('')), 1, 1, '')
FROM myTable AS t
GROUP BY Description
ORDER BY Description;
--select * from mytable1
select
Description,
ISNULL(
REVERSE(STUFF(REVERSE(Name), CHARINDEX(',', REVERSE(Name), 0),1,'dna ')),
Name) Name
From mytable1
select Description, SUBSTRING(Name, 0, (len(Name) - charindex(',', reverse(Name)))) +
Replace(SUBSTRING(Name, (len(Name) - charindex(',', reverse(Name))), len(Name)),
', ', ' and ') from mytable1