簡體   English   中英

返回帶有選擇內變量的SQL子查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM