[英]Return SQL Sub Query with a variable inside Select
我的申請是收銀機。 以下查詢采用TransactionID,並返回在此單筆交易中售出的一行或多行商品,即TransactionID = 28715:
DECLARE @SalesItems varchar(250);
DECLARE @TransactionID int;
SET @TransactionID = 28715;
Select @SalesItems = coalesce(@SalesItems + ', ', '') + CAST(TransactionsPosLines.Description as varchar(250))
From
TransactionsPosLines
where TransactionsPosLines.TransactionId = @TransactionID
select @SalesItems
並返回:
"Widget A, Widget B, Widget C" as a single string.
我還有一天結束的交易報告,我想將字符串(小部件A等)附加到交易報告的末尾。
Select
Transactions.TransactionId,
Transactions.TransactionDate,
Transactions.MoneyIn,
Transactions.MoneyOut,
Transactions.Description,
PaymentMethods.PaymentMethodName,
Transactions.TransactionRef,
Membership.Username,
Tills.Description As 'Till Name',
Transactions.Reason,
-- FOR THIS LAST COLUMN HERE I WANT TO SHOW THE OUTPUT OF THE QUERY ABOVE
====> SalesItems
From
Transactions Left Outer Join
Tills
On Transactions.TillId = Tills.TillId Inner Join
PaymentMethods
On Transactions.PaymentMethodId = PaymentMethods.PaymentMethodsID Inner Join
Membership
On Transactions.UserId = Membership.UserId Inner Join
Where
Transactions.TransactionDate >= @DateStart And
Transactions.TransactionDate <= @DateEnd
因此,當我運行此報告時,我得到的是這樣的:
TransactionId TransactionDate MoneyIn MoneyOut Description PaymentMethodName TransactionRef Username Till Name Reason SalesItems
28715 31/08/2016 09:07 119.99 0 Sale - Card Card 24881 Chantal Till1 Null Widget A, Widget B, Widget C
我使用了交叉應用,以便將結果應用於內部查詢到主查詢的每一行。 檢查這是否對您有幫助:
Select
Transactions.TransactionId,
Transactions.TransactionDate,
Transactions.MoneyIn,
Transactions.MoneyOut,
Transactions.Description,
PaymentMethods.PaymentMethodName,
Transactions.TransactionRef,
Membership.Username,
Tills.Description As 'Till Name',
Transactions.Reason,
-- HERE >>
--SalesItems =
dt.salesItems
From
Transactions Left Outer Join
Tills
On Transactions.TillId = Tills.TillId Inner Join
PaymentMethods
On Transactions.PaymentMethodId = PaymentMethods.PaymentMethodsID Inner Join
Membership
On Transactions.UserId = Membership.UserId
cross apply (
select distinct stuff((
Select ',' + CAST(TransactionsPosLines.Description as varchar(250))
From
TransactionsPosLines
where TransactionsPosLines.TransactionId = Transactions.TransactionId
FOR XML PATH('')),1,1,'') as salesItems
) as dt
-- TransactionsPosLines
-- On TransactionsPosLines.TransactionId = Transactions.TransactionId
Where
Transactions.TransactionDate >= @DateStart And
Transactions.TransactionDate <= @DateEnd
交叉應用於XML合並方法:
Select
t.TransactionId,
t.TransactionDate,
t.MoneyIn,
t.MoneyOut,
t.Description,
p.PaymentMethodName,
t.TransactionRef,
m.Username,
tl.Description As 'Till Name',
t.Reason,
c.SalesItems
From
Transactions t
LEFT JOIN Tills tl
ON t.TillId = tl.TillId
INNER JOIN PaymentMethods p
ON t.PaymentMethodId = p.PaymentMethodID
INNER JOIN Membership m
On t.UserId = m.UserId
CROSS APPLY
(SELECT STUFF(
(SELECT ',' + CAST(tp.Description AS VARCHAR(100))
FROM
TransactionPostLines tp
WHERE t.TransactionId = tp.TransactionId
FOR XML PATH(''))
,1,1,'') as SalesItems) c
Where
t.TransactionDate >= @DateStart
AND t.TransactionDate <= @DateEnd
定義中的AS子選擇:
Select
t.TransactionId,
t.TransactionDate,
t.MoneyIn,
t.MoneyOut,
t.Description,
p.PaymentMethodName,
t.TransactionRef,
m.Username,
tl.Description As 'Till Name',
t.Reason,
STUFF(
(SELECT ',' + CAST(tp.Description AS VARCHAR(100))
FROM
TransactionPostLines tp
WHERE t.TransactionId = tp.TransactionId
FOR XML PATH(''))
,1,1,'') as SalesItems
From
Transactions t
LEFT JOIN Tills tl
ON t.TillId = tl.TillId
INNER JOIN PaymentMethods p
ON t.PaymentMethodId = p.PaymentMethodID
INNER JOIN Membership m
On t.UserId = m.UserId
Where
t.TransactionDate >= @DateStart
AND t.TransactionDate <= @DateEnd
請注意,使用表別名使代碼更易於閱讀和編寫!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.