Ravi Sargam Ответов: 2

Проблема при использовании UNION в SQL


Мой Sql-запрос

select CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120) as 'monthyear',
		SUM(amount) as 'Amount1',0 as 'Amount2' 
from MYtable 
where accountid=4 
group by CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120)
union
select	CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120) as 'monthyear',
		0 as 'Amount1',
		SUM(amount) as 'Amount2'
from MYtable
where accountid=3 
group by CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120)


но когда я выполняю запрос, я получаю данные таким образом..
MonthYear     Amount1     Amount2
Jan 2015      0           100
Jan 2015      100         0
Feb 2015      200         0
Feb 2015      0           300
Mar 2015      400         0
Mar 2015      0           500


Но мне нужны данные в этом формате

MonthYear     Amount1     Amount2
Jan 2015      100         100
Feb 2015      200         300
Mar 2015      400         500


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

Что я уже пробовал:

select CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120) as 'monthyear',
		SUM(amount) as 'Amount1',0 as 'Amount2' 
from MYtable 
where accountid=4 
group by CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120)
union
select	CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120) as 'monthyear',
		0 as 'Amount1',
		SUM(amount) as 'Amount2'
from MYtable
where accountid=3 
group by CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120)

Kornfeld Eliyahu Peter

Союз работает как исключение, это просто неправильный инструмент...Некоторые присоединяются и/или CTE были бы лучше...

Ravi Sargam

как я могу использовать свой запрос с CTE? я новичок в этом деле.

Kornfeld Eliyahu Peter

Если вы новичок, начните с JOIN...

Ravi Sargam

новый на МТК не вступает...

2 Ответов

Рейтинг:
4

ZurdoDev

Как сказал Питер, союз делает именно то, что он должен делать. Простой способ обойти это-обернуть то, что у вас есть, в другой оператор SELECT. Что-то вроде:

SELECT x.monthyear, SUM(x.amount1) AS amount1, SUM(x.amount2) as amount2
FROM (
  select CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120) as   'monthyear',
  SUM(amount) as 'Amount1',0 as 'Amount2' 
  from MYtable 
  where accountid=4 
  group by CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120)
  union
  select	CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120)   as 'monthyear',
  0 as 'Amount1',
  SUM(amount) as 'Amount2'
  from MYtable
  where accountid=3 
  group by CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120)
) x
GROUP BY x.monthyear


Ravi Sargam

Тнх @RyanDev он работает очень хорошо... еще раз спасибо.....

ZurdoDev

Пожалуйста.

ZurdoDev

Решение 2 от Maciej Los-это гораздо лучший ответ, потому что вы все равно не должны объединяться, и решение 2 также будет намного быстрее. Я не очень внимательно изучал, почему вы вступаете в профсоюз.

Maciej Los

А4, потому что есть самый простой способ добиться этого- & gt; используя один SELECT заявление + CASE WHEN ... END- Пожалуйста, посмотрите мой ответ.

Рейтинг:
16

Maciej Los

Тебе это не нужно UNION- с! Вы должны использовать CASE WHEN ... END.

Итак, самый простой способ-это:

SELECT CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120) as 'monthyear',
		SUM(CASE WHEN accountid=4 THEN amount ELSE 0 END) as 'Amount1',
		SUM(CASE WHEN accountid=3 THEN amount ELSE 0 END) as 'Amount2' 
FROM MYtable 
GROUP BY CONVERT(CHAR(4), dateofentry, 100) + CONVERT(CHAR(4), dateofentry, 120)


ZurdoDev

Хороший улов. Я не пошел на лишнюю милю, чтобы понять, почему союз был там. +5.

Maciej Los

Спасибо, Райан.

Ravi Sargam

Это короткое и простое спасибо.. Мацей Лос

Maciej Los

Всегда пожалуйста.

CHill60

5 б

Maciej Los

Спасибо, Кэролайн.