2009-02-25 7 views
3

Если у меня есть набор записейSQL Group By

name amount Code 
Dave 2   1234 
Dave 3   1234 
Daves 4   1234 

Я хочу, чтобы группа на основе кода & Name, но последняя строка имеет опечатку в имени, так что это обыкновение группы.

Что бы лучший способ сгруппировать их как:

Dave/Daves 9 1234

ответ

1

Закрепить опечатку? В противном случае группировка по имени создаст новую группу.

Исправление ваших данных должно быть вашим наивысшим приоритетом, а не пытаться придумать способы «обойти» его.

Следует также отметить, что если у вас есть эта одинарная опечатка в ваших данных, вполне вероятно, что у вас есть (или будет иметь в какой-то момент в будущем) еще более жуткие данные, которые не будут вписываться в ваш код, что заставит вас изобретать все больше и больше «работать вокруг», чтобы справиться с этим, когда вы должны сосредоточиться на чистоте своих данных.

4

Если это временное решение, попробуйте

SELECT cname, SUM(amount) 
FROM (
    SELECT CASE WHEN NAME = 'Daves' THEN 'Dave' ELSE name END AS cname, amount 
    FROM mytable 
) 
GROUP BY cname 

это, если конечно будет обрабатывать только этот точный случай.

5

Как правило, если данные неверны, вы должны исправить данные.

Однако, если вы хотите сделать отчет в любом случае, вы можете найти другие критерии для группировки, например LEFT (Name, 4) будет выполнять группировку по первым 4 символам имени.

Вы также можете рассмотреть оператор CASE как метод (CASE WHEN name = 'Daves' THEN 'Dave' ELSE name), но мне действительно не нравится этот метод, особенно если вы предлагаете использовать этот для чего-то еще, тогда разовый отчет.

1

Для MySQL:

select 
    group_concat(distinct name separator '/'), 
    sum(amount), 
    code 
from 
    T 
group by 
    code 

Для MSSQL 2005+ GROUP_CONCAT() может быть реализован в виде .NET пользовательского агрегата.

+0

Это, вероятно, лучший ответ на точный вопрос, как отправлено, но может привести к уродству по дороге, когда вы получите результаты, которые выглядят как «Dave/DaveS/dave/daves/DAVES/DaveICantTypeRight» – TheTXI

+0

Я все для очистки данных, но для устранения плохих данных вам все равно нужно запросить его. – Constantin

1

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

Группировка по произвольной текстовой области, если это то, что это такое, всегда будет иметь проблемы. Ввод данных не всегда 100%.

Для меня имеет смысл группировать только код, если это ключевое поле и оставить имя из группы вместе.