Для отчета, который я создаю, мне нужно найти Shrink. Усадка в основном разница. Это входной вес (созданный пользователем), вычитаемый из СУММЫ общего веса (OriginalQuantity_Stk
)
В настоящее время я использую выражение
Sum(@InputWeight - [IC_ProductLots].[OriginalQuantity_Stk]) AS [Shrink]
Я также пытался использовать
Sum(@InputWeight - [WEIGHT]) AS [Shrink]
Потому что общая сумма веса уже рассчитана:
Sum(IC_ProductLots.OriginalQuantity_Stk) AS [Weight]
Когда пользователь запускает отчет, он вводит некоторую информацию, и одна часть информации — это входной вес. Например, мы скажем, что они вводят 20 000. Если общий вес составляет 19 800, усадка должна равняться 200.
Пример вывода будет выглядеть так:
Входной вес: 20 000
Номер продукта | Вес | Уменьшить
1234 | 12 000 |
1235 | 6 500 |
1236 | 500 |
1237 | 800 |
--------------------------
ИТОГО |19 800 | 200
Дайте мне знать, если это имеет смысл или нет.
Я использую Microsoft SQL Server 2005.
Полный код для справки:
SET NOCOUNT ON;
DECLARE @PurchaseCost Decimal(19,8);
DECLARE @InputWeight Decimal(19,8);
SET @PurchaseCost = 2.58;
SET @InputWeight = 20000;
SELECT DISTINCT
CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40)) AS [Supplier]
, [PC].ProductCode
, [PC].Description1
, Count(IC_ProductLots.OriginalQuantity_Alt) AS [Boxes]
, IC_ProductLots.UnitOfMeasure_Alt
, Sum(IC_ProductLots.OriginalQuantity_Stk) AS [Weight]
, IC_ProductLots.UnitOfMeasure_Stk
, [ICP].UnitCost AS [Unit Cost]
, Sum(ROUND([DCT].[Quantity_Stk] *[ICP].[UnitCost], 2)) AS [Total Sales]
, Avg(([IC_ProductLots].[OriginalQuantity_Stk] / [IC_ProductLots].[OriginalQuantity_Alt])) AS [Avg. Box Weight]
, Sum([IC_ProductLots].[OriginalQuantity_Stk] / @InputWeight) AS [Yield]
, Sum(@InputWeight - [IC_ProductLots].[OriginalQuantity_Stk]) AS [Shrink]
FROM (((( IC_Products [PC]
INNER JOIN DC_Transactions [DCT]
ON [PC].ProductKey = [DCT].ProductKey)
INNER JOIN AR_Customers [ARC]
ON [DCT].CustomerKey = [ARC].CustomerKey)
INNER JOIN IC_ProductLots
ON [DCT].LotKey = IC_ProductLots.LotKey)
LEFT OUTER JOIN IC_ProductCosts [ICP]
ON ICP.ProductKey=PC.ProductKey and ICP.ProductCostCode=5)
WHERE
(IC_ProductLots.ProductionDate >= { ts '2015-06-24 00:00:00' } AND (IC_ProductLots.ProductionDate <= { ts '2015-06-24 00:00:00' } OR IC_ProductLots.ProductionDate Is Null))
AND ([ARC].CustomerCode = ' 904')
GROUP BY
CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40))
, [PC].ProductCode
, [PC].Description1
, IC_ProductLots.UnitOfMeasure_Alt
, IC_ProductLots.UnitOfMeasure_Stk
, [ICP].UnitCost
, IC_ProductLots.ProductionDate
, [ARC].CustomerCode
ORDER BY
CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40))
@Inputweight - sum( [IC_ProductLots].[OriginalQuantity_Stk]) over (partition by CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40)) , [PC].ProductCode)
определенно будет работать как CTE или подзапрос. Проблема в том, что вам нужна сумма, прежде чем вы сможете выполнить вычитание, но запрос должен обработать все записи, чтобы получить эту сумму. Таким образом, единственный способ получить сумму заранее - это подзапрос, cte или оконная функция (аналитическая). - person xQbert   schedule 10.07.2015