Привет у меня есть консультация select, где я погружаю количество в инвентарь и потом умножаю ее на цену, проблема состоит в том, что для ultimo_costo я должен брать последний реестр и брать цену этого, но не simpre у него есть цена и я должен искать в предыдущем реестре до того, чтобы находить один со стоимостью.
Для последнего реестра у меня нет проблемы я это использую
Material_Trans - id таблицы
select Unit_Cost from material_trans where material_trans = MAX(MT.MATERIAL_TRANS)
Но aveces 0 и он не подает меня, не, если было возможно делать что-то как это
select Unit_Cost from material_trans where material_trans IN Material_trans_list where Unit_Cost != 0 order by Material_Trans Desc
Я помещаю мою консультацию sql
SELECT Material = M.Material,
Descripcion = M.Description,
Existencia = SUM(MT.Quantity),
UdeM_Almacen = M.Stocked_UofM,
Costo_Estandar = FORMAT(M.Standard_Cost * SUM(MT.Quantity), 'C', 'en-us'),
Costo_Ultimo = FORMAT((select Unit_Cost from material_trans where material_trans = MAX(MT.MATERIAL_TRANS)) * SUM(MT.Quantity), 'C', 'en-us'),
Costo_Promedio = FORMAT(AVG(MT.Unit_Cost) * SUM(MT.Quantity), 'C', 'en-us'),
Costo_Promedio_Ponderado = FORMAT(CASE WHEN SUM(MT.Quantity) = 0 THEN 0 ELSE SUM(MT.Quantity*MT.Unit_Cost)/SUM(MT.Quantity) END, 'C', 'en-us'),
UdeM_Costo = M.Cost_UofM
FROM Material_Trans MT
OUTER APPLY (
SELECT COALESCE(MT.Material, MR.Material, S.Material, J.Part_Number, SD.Material) AS Material
FROM Material_Trans IMT
LEFT JOIN Source S ON S.Source = IMT.Source
LEFT JOIN Material_Req MR ON MR.Material_Req = S.Material_Req OR MR.Material_Req = IMT.Material_Req
LEFT JOIN Job_Operation JO ON JO.Job_Operation = S.Job_Operation
LEFT JOIN Job J ON J.Job = JO.Job
LEFT JOIN SO_Detail SD ON SD.SO_Detail = IMT.SO_Detail
WHERE IMT.Material_Trans = mt.Material_Trans
)AS Mat
INNER JOIN Material M ON M.Material = Mat.Material --Solo materiales que existan en material
WHERE
MT.Tran_Type NOT IN ('Invoice', 'LocTfr')
AND MT.Quantity != 0
AND Vendor_Trans IS NULL
AND CAST(MT.Material_Trans_Date AS DATE) <= '2019-10-15'
GROUP BY M.Material, M.Description, M.Stocked_UofM, M.Cost_UofM, M.Cost_UofM, M.Last_Cost, M.Average_Cost, M.Standard_Cost
Спасибо заранее.
Я рекомендую тебе использовать иначе подмостков и в diseГ±o подмостков использовать имя колонн с хорошими практиками
SELECT
Material = M.Material,
Descripcion = M.Description,
Existencia = SUM(MT.Quantity),
UdeM_Almacen = M.Stocked_UofM,
Costo_Estandar = FORMAT(M.Standard_Cost * SUM(MT.Quantity), 'C', 'en-us'),
Costo_Ultimo = FORMAT(ISNULL(TUC.Unit_Cost, 0) * SUM(MT.Quantity), 'C', 'en-us'),
Costo_Promedio = FORMAT(AVG(MT.Unit_Cost) * SUM(MT.Quantity), 'C', 'en-us'),
Costo_Promedio_Ponderado = FORMAT(CASE WHEN SUM(MT.Quantity) = 0 THEN 0 ELSE SUM(MT.Quantity*MT.Unit_Cost)/SUM(MT.Quantity) END, 'C', 'en-us'),
UdeM_Costo = M.Cost_UofM
FROM
Material_Trans MT
OUTER APPLY (
SELECT
COALESCE(MT.Material, MR.Material, S.Material, J.Part_Number, SD.Material) AS Material
FROM Material_Trans IMT
LEFT JOIN Source S ON S.Source = IMT.Source
LEFT JOIN Material_Req MR ON MR.Material_Req = S.Material_Req OR MR.Material_Req = IMT.Material_Req
LEFT JOIN Job_Operation JO ON JO.Job_Operation = S.Job_Operation
LEFT JOIN Job J ON J.Job = JO.Job
LEFT JOIN SO_Detail SD ON SD.SO_Detail = IMT.SO_Detail
WHERE IMT.Material_Trans = MT.Material_Trans
)AS Mat
INNER JOIN Material M ON M.Material = Mat.Material --Solo materiales que existan en material
LEFT JOIN (
SELECT
Z.Material,
Z.MATERIAL_TRANS,
Z.Unit_Cost
FROM
Material_Trans Z WITH(NOLOCK)
INNER JOIN (
SELECT
A.Material,
MAX(MATERIAL_TRANS) MATERIAL_TRANS
FROM
Material_Trans A WITH(NOLOCK)
WHERE
A.Unit_Cost > 0
GROUP BY
A.Material
) Y ON Z.MATERIAL_TRANS = Y.MATERIAL_TRANS
) TUC ON TUC.Material = M.Material
WHERE
MT.Tran_Type NOT IN ('Invoice', 'LocTfr')
AND MT.Quantity != 0
AND Vendor_Trans IS NULL
AND CAST(MT.Material_Trans_Date AS DATE) <= '2019-10-15'
GROUP BY
M.Material,
M.Description,
M.Stocked_UofM,
M.Cost_UofM,
M.Cost_UofM,
M.Last_Cost,
M.Average_Cost,
M.Standard_Cost