2015-01-13 4 views
-4

У меня есть таблицы что-то вроде этого:SQL группы по с NULL

ID ProductID ProductName Price 
== ========= =========== ===== 
1 XX1   TShirt  10 
2 XX1   TShirt  10 
3 NULL   TShirt  10 
4 XX2   Shirt  20 
5 XX3   Shirt1  30 

Теперь я хочу, чтобы это группа ProductName и результаты будут следующие

ID ProductID ProductName Price 
== ========= =========== ===== 
1 XX1   TShirt  30 
4 XX2   Shirt  20 
5 XX3   Shirt1  30 

Благодарности

+0

вы что-то пробовали или ожидали, что мы сделаем это для вас? – NoLiver92

+0

Вам также нужно указать, какой идентификатор вы хотите в своем выходе, когда вы их группируете. Не имеет смысла. Вы также можете указать, какие СУБД вы используете. – Paddy

+0

Какова цель тега .net здесь? Вам действительно нужно объяснить больше ... –

ответ

4

ProductID кажется, не имеет значения для группы, поэтому не используйте его. Для того, чтобы получить все столбцы, которые вы могли бы использовать КТР и ранжирования функции, как ROW_NUMBER:

WITH CTE AS(
    SELECT ID, 
      ProductID, 
      ProductName, 
      Price = SUM(Price) OVER (PARTITION BY ProductName), 
      RN = ROW_NUMBER() OVER (PARTITION BY ProductName ORDER BY ID) 
    FROM dbo.TableName 
) 
SELECT CTE.* FROM CTE 
WHERE RN = 1 

Если вы хотите взять строку, которая содержит ProductID (где он не NULL) изменить ORDER BY:

WITH CTE AS(
    SELECT ID, 
      ProductID, 
      ProductName, 
      Price = SUM(Price) OVER (PARTITION BY ProductName), 
      RN = ROW_NUMBER() OVER (PARTITION BY ProductName 
            ORDER BY CASE WHEN ProductID IS NOT NULL 
            THEN 0 ELSE 1 END, ID) 
    FROM dbo.TableName 
) 
SELECT CTE.* FROM CTE 
WHERE RN = 1 
+0

Очень хорошо, поэтому вы получаете мой голос. Тем не менее, я подозреваю, что OP действительно не знает, чего они хотят и, вероятно, не нуждается в чем-то более сложном, чем группировка по «ProductName» и суммированию цены (т. Е. Не требуется идентификатор) – musefan

+0

Так же, как 'ProductID' кажется неуместным , Я бы сказал, что 'ID' тоже не имеет значения; честно говоря, если мы хотим отказаться от «ProductId», я не могу думать, что для этого требуется что-то более сложное, чем просто «выбрать ProductName, SUM (Price) как [TotalPrice] из группы TableName по ProductName' –

+0

@MarcGravell: возможно, он хочет все поля, даже если они неактуальны, хотя бы для целей «отладки». Но важно знать, какие столбцы должны использоваться для 'GROUP BY', и какие строки групп должны быть возвращены. В образце данных указывается, что ему нужны строки с данными. –

Смежные вопросы