2015-03-01 2 views
-1

У меня возникла проблема при объединении трех таблиц (вроде). У меня есть таблица inv с colums: invdate, invname, invqty, invaction. Типы действий, как: добавление, по-прежнему, спастипри соединении трех таблиц данных, отсутствующих для TSQL

table data: 
invdate, invname, invqty, invaction 
3/1/2015 pizza 10  add 
3/1/2015 bread 10  add 
3/1/2015 soda  10  add 
3/1/2015 pasta 10  add 
3/1/2015 pizza 1  remain 
3/1/2015 bread 1  remain 
3/1/2015 soda  1  remain 
3/1/2015 pasta 1  remain 
3/1/2015 pasta 1  salvage 

текущий запрос:

select a.invdate, a.invname, sum(a.invqty), sum(b.invqty), sum(c.invqty) 
from inv a 
join inv b on a.invdate = b.invdate and a.invname = b.invname 
join inv c on b.invdate = c.invdate and b.invname = c.invname 

wanted result: 
invdate, invname, added, remain, salavge 
3/1/2015 pizza 10  1 
3/1/2015 bread 10  1 
3/1/2015 soda  10  1  
3/1/2015 pasta 10  1  1 

результат: я получить только макароны, но не другие. Я пытаюсь показать все строки, а не просто макароны. Я также пробовал с левым внешним соединением и тот же. он отлично работает, когда я пытаюсь объединить 2 таблицы, но не 3 и более. Что мне не хватает? может кто-нибудь объяснить? Спасибо.

+0

Вы присоединяетесь к inv как b дважды. Откуда взялось c? У вас большие проблемы, чем неправильные данные. –

+0

Пожалуйста, объясните, что вы пытаетесь сделать. Запрос работает правильно, но явно не дает желаемых результатов. –

+0

извините опечатка. изменил запрос b на c. Я пытаюсь показать все данные. с именами без спасения, по-прежнему показывает 0 –

ответ

0

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

select invdate, invname, 
     sum(case when invaction = 'add' then invqty else 0 end) as add, 
     sum(case when invaction = 'remain' then invqty else 0 end) as remain, 
     sum(case when invaction = 'salvage' then invqty else 0 end) as salvage 
from inv 
group by invdate, invname; 

Вы также можете использовать pivot и другие механизмы для этого.

+0

, это именно то, что мне нужно. Спасибо. что было бы хорошим местом, чтобы узнать больше о tsql? можете ли вы предложить? –

+0

@JimChen. , , Сначала начните понимать свои проблемы. Используйте примеры данных и желаемые результаты, а не только для вопросов о переполнении стека, но для себя. Затем для изучения языка существует множество книг, учебных пособий и ресурсов, но Stack Overflow - это не место, чтобы делать такие рекомендации. –

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