Группировать по идентичной строке без преобразования в конкатенированную строку

Предположим, у меня есть 3 таблицы (как показано ниже).

Таблица серия_номер:

|   id  |  desc_seriesno  |
|:------|----------------:|
| 7040  |     AU1011      |
| 7041  |     AU1022      |
| 7042  |     AU1033      |
| 7043  |     AU1044      |
| 7044  |     AU1055      |
| 7045  |     AU1066      |

Таблица бренд:

|   id  |  desc_brand     |
|:------|----------------:|
| 1020  |     Audi        |
| 1021  |     Bentley     |
| 1022  |     Ford        |
| 1023  |     BMW         |
| 1024  |     Mazda       |
| 1025  |     Toyota      |

Таблица car_info:

|   seriesno_id  |  brand_id  |  color  |
|:---------------|------------|--------:|
|     7040       |    1020    | white   |
|     7040       |    1020    | black   |
|     7040       |    1020    | pink    |
|     7041       |    1021    | yellow  |
|     7041       |    1021    | brown   |
|     7042       |    1022    | purple  |
|     7042       |    1022    | black   |
|     7042       |    1022    | green   |
|     7043       |    1023    | blue    |
|     7044       |    1024    | red     |
|     7045       |    1025    | maroon  |
|     7045       |    1025    | white   |    

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

это мой текущий запрос с сервером sql 2014: -

SELECT SN.id AS seriesid, B.id AS brandid, B.desc_brand
FROM [db1].[dbo].[series_no] SN
  LEFT JOIN [db1].[dbo].[car_info] CI
  ON CI.seriesno_id = SN.id
  RIGHT JOIN [db1].[dbo].[brand] B
  ON B.id = CI.brand_id
GROUP BY SN.id, B.id, B.desc_brand
ORDER BY SN.id ASC

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

Я хочу, чтобы это было так: -

|  seriesid  |   brandid  |   desc_brand  |
|:-----------|------------|--------------:|
|    7040    |    1020    |     Audi      |
|    7041    |    1021    |     Bentley   |
|    7042    |    1022    |     Ford      |
|    7043    |    1023    |     BMW       |
|    7044    |    1024    |     Mazda     |
|    7045    |    1025    |     Toyota    |

вместо этого (объединенная строка): -

|  seriesid  |   brandid  |       desc_brand      |
|:-----------|------------|----------------------:|
|    7040    |    1020    |     Audi, Audi, Audi  |
|    7041    |    1021    |     Bentley, Bentley  |
|    7042    |    1022    |     Ford, Ford, Ford  |
|    7043    |    1023    |     BMW               |
|    7044    |    1024    |     Mazda             |
|    7045    |    1025    |     Toyota, Toyota    |

person user3657273    schedule 15.12.2016    source источник
comment
Вам это нужно как конкатенация?   -  person Ullas    schedule 15.12.2016
comment
Нет. Я бы предпочел, чтобы это не было объединенной строкой, потому что desc_brand в основном содержит одну и ту же строку. Возможно ли это сделать? (без преобразования в конкатенированную строку)   -  person user3657273    schedule 15.12.2016


Ответы (1)


Просто вам нужно избегать дубликатов, поэтому используйте один из следующих двух подходов:

Группа по

select col1, col2 .. 
from table1 a inner join table2 b
on ..
group by col1, col2 .. 

Отчетливый

 select distinct col1, col2 .. 
    from table1 a inner join table2 b
    on ..

Демо:-

Create database TestDB
go
use TestDB
go
Create table series_no (id int ,desc_seriesno varchar(20) )
go
insert into series_no values (7040, 'AU1011'),
                        (7041, 'AU1022'),
                        (7042, 'AU1033'),
                        (7043, 'AU1044'),
                        (7044, 'AU1055'),
                        (7045, 'AU1066')
go
Create table brand (id int ,desc_brand varchar(20) )
go
insert into brand values (1020, 'Audi'),
                        (1021, 'Bentley'),
                        (1022, 'Ford'),
                        (1023, 'BMW'),
                        (1024, 'Mazda'),
                        (1025, 'Toyota')

Create table car_info (seriesno_id int ,brand_id varchar(20), color varchar (20) )
go
insert into car_info values(7040,1020,'white'),
(7040,1020,'black'),
(7040,1020,'pink'),
(7041,1021,'yellow'),
(7041,1021,'brown'),
(7042,1022,'purple'),
(7042,1022,'black'),
(7042,1022,'green'),
(7043,1023,'blue'),
(7044,1024,'red'),
(7045,1025,'maroon'),
(7045,1025,'white')
go

select a.seriesno_id as seriesnoid, a.brand_id as brandid,b.desc_brand
from car_info a inner join brand b
on brand_id = id
group by a.seriesno_id , a.brand_id ,b.desc_brand

/*
-- Or
select distinct a.seriesno_id as seriesnoid, a.brand_id as brandid,b.desc_brand
from car_info a inner join brand b
on brand_id = id
*/

Результат:-

введите здесь описание изображения

person ahmed abdelqader    schedule 15.12.2016
comment
это работает! Если я запущу этот код как есть, он выдаст мне эту ошибку. Типы данных text, ntext и image нельзя сравнивать или сортировать, за исключением случаев использования оператора IS NULL или LIKE, поскольку мой desc_brand объявлен как ntext. Итак, я изменил свой запрос в соответствии с этим решением здесь link вместо изменения типа переменной в базе данных. - person user3657273; 19.12.2016
comment
поэтому с самого начала не хватает информации, когда вы просите решить вашу проблему. предполагается предоставить нам структуру ваших таблиц. , приятно дать вам ключ к решению. - person ahmed abdelqader; 19.12.2016