Группа по ID и сумме из другой таблицы (всего 3 таблицы) - PullRequest
2 голосов
/ 24 марта 2012

У меня три таблицы,

Name - columns 
Custpackingslipjour(table 1) - (deliverydate, dateclosed,, salesid)
Inventrans (Table 2) -  (itemid, datephysical, transrefid)
Salesline (Table 3) -  (lineamount, itemid, salesid

Что мне нужно, так это одна таблица, содержащая все три таблицы, но без избыточной информации, такой как кратное число одинаковых salesids, с общей суммой (salesline.lineamount) и где я могу исключить результаты на основе даты доставки и даты закрытия, вместе с фиктическим, изначально у меня было это.

SELECT     TOP (10) dbo.AX_CUSTPACKINGSLIPJOUR.DELIVERYDATE,
dbo.AX_SALESLINE.LINEAMOUNT, dbo.AX_INVENTTRANS.DATEPHYSICAL, 
dbo.AX_INVENTTRANS.COSTAMOUNTPOSTED, dbo.AX_INVENTTRANS.ITEMID, 
dbo.AX_INVENTTRANS.TRANSREFID, dbo.AX_CUSTPACKINGSLIPJOUR.SALESID
FROM         dbo.AX_CUSTPACKINGSLIPJOUR
     INNER JOIN
dbo.AX_SALESLINE ON dbo.AX_CUSTPACKINGSLIPJOUR.SALESID = dbo.AX_SALESLINE.SALESID 
     INNER JOIN
     dbo.AX_INVENTTRANS ON dbo.AX_SALESLINE.ITEMID = dbo.AX_INVENTTRANS.ITEMID

Но он создает таблицу со многими одинаковыми строками из-за врожденного отношения «один ко многим» между salesid и itemid.

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

Основываясь на нескольких других постах здесь, я попытался объединить сумму lineamount из salesline, сгруппировав ее по salesid, но после 5 минут работы это не показалось хорошим решением, я думаю, что имею право идея, но я делаю это неправильно.

select top 10 s.SALESID,
    SUM(sp.LINEAMOUNT) as 'TotalLineamount'
from AX_CUSTPACKINGSLIPJOUR as s
right outer join AX_SALESLINE as sp on s.SALESID=sp.SALESID 
left outer join AX_INVENTTRANS as p on sp.ITEMID=p.ITEMID
where s.SALESID is not null
group by s.SALESID,sp.LINEAMOUNT

Любая помощь очень ценится, и я буду следить за любыми вопросами или комментариями, если то, что я пытаюсь сделать, неясно.

Редактировать: Следуя совету @ coltech и пробуя разные слова на salesid, не сработало, но это было проверено. Я вставил отчетливый (salesid) после 10

Редактировать: следуя совету Гевинса, я изменился на

select top 10 cp.SALESID,
SUM(sl.LINEAMOUNT) as 'TotalLineamount'
from AX_CUSTPACKINGSLIPJOUR as cp
right outer join AX_SALESLINE as sl on cp.SALESID=sl.SALESID 
left outer join AX_INVENTTRANS as it on sl.ITEMID=it.ITEMID
where cp.SALESID is not null
group by cp.SALESID

Я также изменил префиксы для таблиц, чтобы они лучше соответствовали именам таблиц. Это работает, однако, если я хочу включить больше столбцов, например. sl.LINEAMOUNT, it.DATEPHYSICAL, it.COSTAMOUNTPOSTED, it.ITEMID, it.TRANSREFID и cp.SALESID

тогда мне придется включить их в группу как таковую.

select top 10 cp.SALESID,
SUM(sl.LINEAMOUNT) as 'TotalLineamount',
cp.DELIVERYDATE,
sl.LINEAMOUNT, it.DATEPHYSICAL, 
it.COSTAMOUNTPOSTED, it.ITEMID, 
it.TRANSREFID, cp.SALESID
from AX_CUSTPACKINGSLIPJOUR as cp
right outer join AX_SALESLINE as sl on cp.SALESID=sl.SALESID 
left outer join AX_INVENTTRANS as it on sl.ITEMID=it.ITEMID
where cp.SALESID is not null
group by cp.SALESID, cp.DELIVERYDATE,sl.LINEAMOUNT, it.DATEPHYSICAL, it.COSTAMOUNTPOSTED, it.ITEMID, it.transrefid

Однако, похоже, это приводит к тому, что запрос выполняется в течение очень долгого времени, работающего около 25 минут. Есть ли способ ускорить это? Или я просто ошибаюсь?

1 Ответ

2 голосов
/ 24 марта 2012

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

select top 10 s.SALESID,
    SUM(sp.LINEAMOUNT) as 'TotalLineamount'
from AX_CUSTPACKINGSLIPJOUR as s
right outer join AX_SALESLINE as sp on s.SALESID=sp.SALESID 
left outer join AX_INVENTTRANS as p on sp.ITEMID=p.ITEMID
where s.SALESID is not null
group by s.SALESID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...