У меня три таблицы,
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 минут. Есть ли способ ускорить это? Или я просто ошибаюсь?