2016-06-03 2 views
0

Я должен объединить два поля результатов на основе моего требования. Например, ниже запрос дает результат, как показано. Но мне нужно деловое утверждение, в котором говорится, что и «ветер», и «ветер с» одинаковы, поэтому объединяют его общее количество.SQL-запрос для объединения всего двух полей

SELECT result, COUNT(*) AS total from(
SELECT t.Id AS Id, 
    CASE 
    WHEN LTRIM(RTRIM(AC)) = ' ' THEN AG 
    WHEN LOWER(AC) IS NOT NULL THEN LOWER(AC) 
    ELSE LOWER(AG) 
    END AS result,MaxDate, 
FROM [DC_20160601] t 
INNER JOIN (SELECT Id, MAX(DateTime) AS MaxDate 
FROM [DC_20160601] 
GROUP BY Id) tm 
ON t.Id = tm.Id AND t.DateTime = tm.MaxDate) 
GROUP BY result 

Текущий результат:

Result Total 
Wind  1212 
Wind c 345 
sqrim  321 
sqrim mob 123 

Ожидаемый результат:

Result  Total 
Wind mobile 1557 
Sqrim mobile 444 
+0

Можно ли предположить, что оба поля в заданных парах имеют одинаковый префикс, а все пары имеют разные префикс? Например, 'Wind' и' Wind c' имеют одинаковый префикс 'Wind'. Тогда 'Wind' и' Sqrim' отличаются друг от друга. –

+0

Проверьте свои данные. Мне кажется, что у вас разные значения для AC, которые вы ожидаете в таблице DC_20160601. Похоже, вам может понадобиться агрегировать базу на «Ветер» и «Sqrim». Если это так, то вам нужно скопировать левую сторону AC или AG до промежутка между ними. –

+1

Вы уверены, что используете MySQL? Помещение '[]' вокруг имен таблиц для SQL-Server. – Barmar

ответ

0

Вы можете выбрать первое слово в строке с помощью substring_index

SELECT SUBSTRING_INDEX(`result`, ' ', 1); 

Теперь группа по первым слово result

SELECT SUBSTRING_INDEX(`result`, ' ', 1), COUNT(*) AS total from(
SELECT t.Id AS Id, 
    CASE 
    WHEN LTRIM(RTRIM(AC)) = ' ' THEN AG 
    WHEN LOWER(AC) IS NOT NULL THEN LOWER(AC) 
    ELSE LOWER(AG) 
    END AS result,MaxDate, 
FROM [DC_20160601] t 
INNER JOIN (SELECT Id, MAX(DateTime) AS MaxDate 
FROM [DC_20160601] 
GROUP BY Id) tm 
ON t.Id = tm.Id AND t.DateTime = tm.MaxDate) 
GROUP BY SUBSTRING_INDEX(`result`, ' ', 1) 
0

Вы могли бы попытаться извлечь все до первого места и использовать для группировки:

SUBSTRING_INDEX(result, ' ', 1) 

В противном случае вам необходимо поддерживать таблицу поиска для сопоставления нескольких вариантов к одному результату.

0

Вы можете добавить операторы case в качестве внешнего запроса. Предполагая, что ваш запрос возвращает текущий результат, который вы опубликовали, вот пример необходимых операторов case: select case when a.result = 'Wind' or a.result = 'Wind c' then 'Wind mobile' else case when a.result = 'sqrim' or a.result = 'sqrim mob' then 'Squirm mobile' end end as res, sum(total) from ( SELECT result, COUNT(*) AS total from( SELECT t.Id AS Id, CASE WHEN LTRIM(RTRIM(AC)) = ' ' THEN AG WHEN LOWER(AC) IS NOT NULL THEN LOWER(AC) ELSE LOWER(AG) END AS result,MaxDate, FROM [DC_20160601] t INNER JOIN (SELECT Id, MAX(DateTime) AS MaxDate FROM [DC_20160601] GROUP BY Id) tm ON t.Id = tm.Id AND t.DateTime = tm.MaxDate) GROUP BY result ) a group by res Было бы лучше иметь значения в операторах case, указанных в таблице поиска, и получить их оттуда или вы может просто добавить дополнительные в качестве аргументов в случае необходимости, но это не идеально ... Надеюсь, это поможет!

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