[英]Update Statement with Sub-query
我有以下查詢:
DECLARE @fromdate date = '2016-09-01'
DECLARE @todate date = '2016-10-03'
SELECT
inventoryKey,
SUM(DATEDIFF(DAY, transdate, @todate) * qty) AS daysavailable
FROM
(SELECT
InventoryKey,
CONVERT(date, invch.transactiondate) AS transdate,
SUM(invch.additionqty + invch.SubtractionQty) AS qty
FROM
dw.dbo.inventorychange invch
WHERE
(TransactionDate IS NOT NULL OR TransactionType <> '')
AND TransactionType NOT IN ('TRANSFER IN', 'TRANSFER OUT', 'BALANCE', 'LEASED')
AND InventoryKey = 'A000HV9T'
AND TransactionDate BETWEEN @fromdate AND @todate
GROUP BY
invch.TransactionDate, InventoryKey) AS a
GROUP BY
InventoryKey
單獨運行完全可以。 但是,我正在創建一個存儲過程,該過程將執行許多計算,其中之一就是上述計算。 該存儲過程將返回一個表,該表中的實際值將被更新。 但是,我不完全知道如何在子查詢更新語句中准確地進行翻譯。
這是我下面的內容:
declare @inventorychanges table
(
inventorykey nvarchar(10),
warehouse nvarchar(10),
transdate date,
trantype nvarchar(25),
additionqty numeric,
subtractionqty numeric
)
insert into @inventorychanges (inventorykey, warehouse, transdate, trantype, additionqty, subtractionqty)
select invch.inventorykey, invch.warehouse, invch.TransactionDate, invch.TransactionType, invch.additionqty, invch.SubtractionQty
from dw.dbo.inventorychange invch
join @icodes ic on ic.inventorykey = invch.inventorykey
WHERE invch.TransactionDate BETWEEN @fromdate AND @todate
and invch.warehouse = ISNULL(@location, '')
AND (TransactionDate IS NOT NULL OR TransactionType <> '')
AND TransactionType NOT IN ('TRANSFER IN' ,'TRANSFER OUT', 'BALANCE', 'LEASED')
/* Update Days Available*/
UPDATE ic
SET ic.daysavaialblepsgear = (
SELECT SUM(invch.additionqty + invch.subtractionqty)
)
FROM @icodes ic, @inventorychanges invch
where invch.inventorykey = ic.inventorykey
但是,這似乎並沒有按預期的那樣工作。 任何人都可以為我指出正確的方向,以實現我的目標。
這是使用CTE
一種方法
DECLARE @fromdate date = '2016-09-01'
DECLARE @todate date = '2016-10-03'
;with cte as
(
SELECT
inventoryKey,
SUM(DATEDIFF(DAY, transdate, @todate) * qty) AS daysavailable
FROM
(SELECT
InventoryKey,
CONVERT(date, invch.transactiondate) AS transdate,
SUM(invch.additionqty + invch.SubtractionQty) AS qty
FROM
dw.dbo.inventorychange invch
WHERE
(TransactionDate IS NOT NULL OR TransactionType <> '')
AND TransactionType NOT IN ('TRANSFER IN', 'TRANSFER OUT', 'BALANCE', 'LEASED')
AND InventoryKey = 'A000HV9T'
AND TransactionDate BETWEEN @fromdate AND @todate
GROUP BY
invch.TransactionDate, InventoryKey) AS a
GROUP BY
InventoryKey
)
UPDATE ic
SET ic.daysavaialblepsgear = invch .daysavailable
FROM @icodes ic
Join CTE invch
ON invch.inventorykey = ic.inventorykey
您還可以將整個子查詢放置在JOIN
的CTE
處
UPDATE ic
SET ic.daysavaialblepsgear = invch .daysavailable
FROM @icodes ic
JOIN (SELECT inventorykey,
Sum(Datediff(day, transdate, @todate) * qty) AS
daysavailable
FROM (SELECT inventorykey,
CONVERT(DATE, invch.transactiondate) AS
transdate,
Sum(invch.additionqty + invch.subtractionqty) AS qty
FROM dw.dbo.inventorychange invch
WHERE ( transactiondate IS NOT NULL
OR transactiontype <> '' )
AND transactiontype NOT IN (
'TRANSFER IN', 'TRANSFER OUT',
'BALANCE',
'LEASED'
)
AND inventorykey = 'A000HV9T'
AND transactiondate BETWEEN @fromdate AND @todate
GROUP BY invch.transactiondate,
inventorykey) AS a
GROUP BY inventorykey) invch
ON invch.inventorykey = ic.inventorykey
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.