SQL DISTINCT, GROUP BY OR ....? - PullRequest
       21

SQL DISTINCT, GROUP BY OR ....?

0 голосов
/ 16 августа 2011

У меня есть база данных со следующими столбцами

SKU | designID | designColor | width | height | price | etc.

SKU число уникально и designID повторяется.

По сути, я хочу DISTINCT или GROUP BY designID и получить значение оставшейся строки, даже если они не повторяются.

Пример:

123 | A-1 | RED | 2 | 3 | $200 | etc.
135 | A-2 | BLU | 8 | 4 | $150 | etc.

В конце концов, я смогу отсортировать их по любому столбцу Я уже пробовал GROUP BY и DISTINCT, но ни один из них не возвращает остальное значение строки.

Пример:

SELECT DISTINCT designID
FROM tbl_name

Который вернется

A-1  
A-2

и других данных нет.

GROUP BY пример:

SELECT designID, designColor
FROM tbl_name
GROUP BY designID, designColor

Который вернется

A-01 | RED
A-02 | BLU

Любая идея, чтобы я мог получить результат DISTINCT со всеми значениями строки?

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

====================================

Спасибо всем за ваше время и советы, пожалуйста, позвольте мне описать больше;

В основном мне нужно исключить повторяющийся designID и показать только один из них, и не имеет значения, какой из них, первый, средний или последний. Важным является тот, который я показываю, должен иметь всю информацию о строках, такую ​​как SKU, цена, размер и т. Д. Я не знаю, может быть, я должен использовать другой код, а не DISTINCT или GROUP BY.

Вот что я хочу от базы данных.

enter image description here

Ответы [ 5 ]

5 голосов
/ 16 августа 2011

Если я не пойму неправильно, вы можете SELECT DISTINCT для нескольких столбцов:

SELECT 
  DISTINCT designID,
  designColor,
  width,
  height,
  price
FROM tbl_name
ORDER BY designColor

Это даст вам все уникальные строки.Если у вас есть, например, два значения designID в 15 общих строках с 2 и 3 различными значениями designColor соответственно, это даст вам 5 строк.

2 голосов
/ 17 августа 2011

Если вам все равно, какая строка будет возвращена, вы можете использовать MAX и группу подзапросов по :

create table #test(
    SKU int,
    designID varchar(10),
    designColor varchar(10),
    width int,
    height int,
    price real,
    etc varchar(50)
)

insert into #test values(123, 'A-1' ,'RED', 2, 3, '200', 'etc')
insert into #test values(135, 'A-2' ,'BLUE', 8, 4, '150', 'etc')
insert into #test values(128, 'A-2' ,'YELLOW', 6, 9, '300', 'etc')

select t.*  FROM    #test t INNER JOIN
(
    SELECT    MAX(SKU) as MaxSKU,designID
    FROM      #test
    GROUP BY  designID
) tt 
ON t.SKU = tt.MaxSKU;

drop table #test;

Результат:

SKU    designID designColor    width    height  price   etc
123      A-1       RED            2      3       200    etc
135      A-2       BLUE           8      4       150    etc
2 голосов
/ 16 августа 2011

Если все они гарантированно будут повторяться (100%, т.е. все столбцы), тогда отличным будет ваш друг.т. е.

SELECT DISTINCT design_id, designColor, width, height, price FROM tbl_name

Это даст разные значения для всего, кроме SKU (которое всегда будет уникальным и помешает вашему различению.

Если вы хотите уникальные значения designId идругие результаты отличаются, тогда вам нужно выяснить, какое из значений вы хотите.Если вам действительно все равно, вы можете просто произвольно выбрать и агрегировать функцию (скажем, MIN) и использовать GROUP BY

, т.е.

SELECT designID, MIN(designColor) FROM tbl_name GROUP BY designID

Это даст вам уникальный идентификатор дизайна и a значение для других столбцов.

Если вы хотите designID дляНаибольший перекос, вы можете использовать функцию ранжирования, т.е.

;WITH rankedSKUs 
AS
( 
    SELECT SKU, ROW_NUMBER() OVER(ORDER BY SKU DESC) as id 
    FROM tbl_name
)
SELECT * 
FROM tbl_name T
WHERE EXISTS(SELECT * FROM rankedSKUs where id = 1 and SKU = T.sku)

. Это вернет все столбцы для каждого отдельного designID, принимая наибольшее значение для SKU как достоверное для каждого разработанного.

0 голосов
/ 17 августа 2011

Если вы используете LINQ, вы можете использовать что-то вроде этого:

get_data_context().my_table.GroupBy( t => t.designID ).Select( t => new { t.Key, 
    REST = t.Select( u => new { u.SKU , u.designID , u.designColor , u.width , 
    u.height , u.price } ) } );
0 голосов
/ 16 августа 2011

Если вы хотите вернуть каждое поле, вы также можете удалить distinct (при условии, что у вас есть id, как вы, кажется,).

Ваш запрос действительно странный, потому что если вы скажете,

SELECT DISTINCT designID
FROM tbl_name

вы получите список уникальных идентификаторов дизайна, и если вы посмотрите в таблице все строки с этими идентификаторами, вы получите каждую строку в таблице ,

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

...