2014-12-11 4 views
0

У меня есть SQL-запрос:Объединение строк в запросе

select el as COL_1, sum(volume) as COL_2 
from table1 
where el like 'False%' and Month = 'SEP' and year(RollUpDate) = '2014' group by el 
union 
select el as COL_1, sum(volume) as COL_2 
from table1 
where el = 'True' and Month = 'SEP' and year(RollUpDate) = '2014' group by el 

который вернет:

true | 12 
false a| 12 
false b| 13 
false 2| 3 

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

true | 12 
false | 55 

Любая помощь приветствуется, SQL Server 2 008 btw

EDIT: Ну, эти решения велики и работают как описано, но я не могу использовать их с жесткой настройкой jdbc, поэтому я не могу использовать аргументы case. Ответ Jarlh близок, но когда возвращается нулевой результат, он все еще имеет те столбцы, которые были созданы, если был простой способ для этого вернуть null, не используя аргументы case, это было бы прекрасно

+0

Side Примечание: при вызове функций на 'RollUpDate', вы не можете использовать индексы для ускорения сравнения для этого столбца. Если вы выполнили запрос диапазона ([включительно нижняя граница, эксклюзивная верхняя граница] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil -have-in-common.aspx)), вы можете использовать индекс тривиально. –

ответ

1
select 'False' as COL_1, sum(volume) as COL_2 
from table1 where el like 'False%' and Month = 'SEP' and year(RollUpDate) = '2014' 
union all 
select 'True' as COL_1, sum(volume) as COL_2 
from table1 
where el = 'True' and Month = 'SEP' and year(RollUpDate) = '2014' 
1

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

SELECT t.COL_1, sum(t.COL_2) FROM 
    ((select el as COL_1, sum(volume) as COL_2 
    from table1 
    where el like 'False%' and Month = 'SEP' and year(RollUpDate) = '2014' group by el) 
    union all 
    (select el as COL_1, sum(volume) as COL_2 
    from table1 
    where el = 'True' and Month = 'SEP' and year(RollUpDate) = '2014' group by el)) t 
WHERE t.COL_1 = 'false' 
GROUP BY t.COL_1 
1

Используйте подзапрос и агрегацию:

select col_1, sum(Col_2) 
from ((select el as COL_1, sum(volume) as COL_2 
     from table1 
     where el like 'False%' and Month = 'SEP' and year(RollUpDate) = '2014' 
     group by el 
    ) union all 
     (select el as COL_1, sum(volume) as COL_2 
     from table1 
     where el = 'True' and Month = 'SEP' and year(RollUpDate) = '2014' 
     group by el 
    ) 
    ) t 
group by col_1; 

Однако это слишком сложным. Вы можете просто сделать:

select (case when el like 'False%' then 'false' 
      else 'True' 
     end) as COL_1, sum(volume) as COL_2 
from table1 
where (el = 'True' or el like 'False%') and Month = 'SEP' and year(RollUpDate) = '2014' 
group by (case when el like 'False%' then 'false' 
       else 'True' 
      end) 

То есть, вам не нужен union вообще. Просто используйте оператор case для столбца, используемого для агрегации.

EDIT:

На самом деле, исходный запрос различает между различными формами "ложно". Предыдущий запрос, возможно, что ОП хочет, но следующий более эквивалентно исходному запросу:

select el as COL_1, sum(volume) as COL_2 
from table1 
where (el = 'True' or el like 'False%') and Month = 'SEP' and year(RollUpDate) = '2014' 
group by el; 
+0

2-й вариант намного лучше –

0

Ну, хотя все ответы были правильными, они были не совсем то, что я искал потому что, хотя @Jarlh приблизился.

Я хотел сделать временный столбец, который предоставил истинные и ложные строки, но это не появилось, когда строка тома была нулевой. Это то, что я закончил с:

select 'False' as COL_1, coalesce(sum(volume),0) as COL_2 from tl1 where el like 'False%' and Month = :month and year(RollUpDate) = :year having sum(Volume) is not null 
union 
select 'True' as COL_1, coalesce(sum(volume),0) as COL_2 from tbl1 where el = 'True' and Month = :month and year(RollUpDate) = :year having sum(Volume) is not null 
Смежные вопросы