Извлечение поля стоимости из подзапроса - PullRequest
0 голосов
/ 18 декабря 2018

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

select 
i.tranid
, it.item_id
, it.displayname
, tl.Item_Count * -1 Unit_Qty
, case when tl.Item_Count=0 then 0 
         else ((tl.GROSS_AMOUNT * -1)/ Item_Count) * -1 
end as PricePerUnit,

**(select sum(c.tranamt) from ns.COSreport c
  inner join ns.ProfitabilityReport d
  on c.InvoiceID = d.tranid 
and c.item_id = d.item_id) as 'True Cost'**

, '0' 'Cost Per M'

from ns.tinvoice i
join ns.transaction_lines tl on i.transaction_id = tl.transaction_id
join ns.Customers cust on c.customer_id = i.ENTITY_ID
join ns.items it on it.item_id = tl.item_id
left join ns.ITEM_CLASSIFICATION it_class on it_class.list_id = 
it.ITEM_CLASSIFICATION_ID
where list_item_name IS NOT NULL
and i.tranid = '1262INV'

Я присоединяюсь как к invoice id, так и к item id, так что для данного счета-фактуры и предмета из COSReport определяется правильная стоимость.

Однако истинная стоимость не определяется стоимостью единицы, а суммирует поле стоимости для всей таблицы.

См. Ниже, например, использование счета # 1262INV, указанного в запросе выше.Стоимость должна составлять 1,04, 0,26 и 4 соответственно против 138 м.

enter image description here

Любая помощь в получении этой информации будет оценена

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Я действительно предпочитаю использовать CTE для удобства чтения.Вы можете взять свой подзапрос, поместить его в CTE, а затем присоединить к нему в своем основном запросе, но вы захотите добавить поля tranid и item_id в CTE, чтобы их можно было использовать в своем объединении.

РЕДАКТИРОВАТЬ: поскольку вы используете SQL Server Azure, вам не нужно ставить точку с запятой перед WITH.

WITH TrueCosts AS
(
    SELECT
        d.tranid 
        ,d.item_id
        ,TrueCost = SUM(c.tranamt) 
    FROM ns.COSreport c
    INNER JOIN ns.ProfitabilityReport d
        ON c.InvoiceID = d.tranid 
            AND c.item_id = d.item_id
    GROUP BY d.tranid 
        ,d.item_id
)
SELECT 
    i.tranid
    , it.item_id
    , it.displayname
    , tl.Item_Count * -1 Unit_Qty
    , case when tl.Item_Count=0 then 0 
             else ((tl.GROSS_AMOUNT * -1)/ Item_Count) * -1 
        END as PricePerUnit
    , tc.TrueCost AS 'True Cost'
    , '0' AS 'Cost Per M'
FROM ns.tinvoice i
JOIN ns.transaction_lines tl on i.transaction_id = tl.transaction_id
JOIN ns.Customers c on c.customer_id = i.ENTITY_ID
JOIN ns.items it on it.item_id = tl.item_id
LEFT JOIN ns.ITEM_CLASSIFICATION it_class on it_class.list_id = it.ITEM_CLASSIFICATION_ID
LEFT JOIN TrueCosts tc ON tc.tranid = i.tranid AND tc.item_id = tl.item_id
WHERE list_item_name IS NOT NULL
    AND i.tranid = '1262INV'
0 голосов
/ 18 декабря 2018

У вас есть пара проблем.

В вашем подзапросе вы используете псевдоним c для COSReport.Вы также используете псевдоним c для customers во внешнем запросе.

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

Чтобы соотнести ваш подзапрос, вам нужно присоединиться (в подзапросе) к одной из таблиц во внешнем запросе.Не уверен в ваших таблицах или данных, но предположил бы, что вы хотите использовать ns.tinvoice i в предложении WHERE в своем подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...