难以获取以前的查询记录

Posted

技术标签:

【中文标题】难以获取以前的查询记录【英文标题】:Having difficulty in getting previous query record 【发布时间】:2016-09-08 09:13:17 【问题描述】:

我有 4 家不同级别的商店。 (商店 A、商店 B、商店 C、商店 D)。商店保留物品。 (项目 1、项目 2、项目 3、项目 4 和项目 5)。

我有 3 个表(项目表、存储表、 Tracking Table) 和 1 个查询 ( Store_rec query for Item2 in Store B)。

跟踪表包含列(ID、T_Date、Item_ID、Item_Name、Store_From、Store_To、Amount、Remark)。

Store_rec 查询表用于检查 Store 中 Item 的变化(在我的例子中 - Store B 中的 Item 2)。它有 5 列(SrNo、T_Date、Location_To/From(从 B 到其他人/从其他人到 B)、Received(B 余额增加)和 Dispatched(B 余额减少)。

我的问题是:

    我无法在不影响T_Date的行号的情况下对SrNo进行升序排序。

    我想在 Store_rec 查询中添加一个余额列,如图所示。 (余额 = 以前的余额 + 已收到 - 已发送)。

我在 Google 中搜索过,在论坛、教程和示例中阅读过,但仍然无法解决我的问题。

请帮忙。

SELECT (
        SELECT COUNT(aa.[ID]) + 1
        FROM Tracking AS aa
        WHERE (
                t.[Store_From] = "Store B"
                OR t.[Store_To] = "Store B"
                )
            AND aa.[ID] < t.[ID]
        ) AS SrNo
    ,t.T_Date
    ,IIf(t.[Store_To] = "Store B", t.[Store_From], t.[Store_To]) AS [Location_To/From]
    ,IIf(t.[Store_To] = "Store B", t.[Amount], 0) AS Received
    ,IIf(t.[Store_From] = "Store B", t.[Amount], 0) AS Dispatched
FROM Tracking AS t
WHERE (
        t.[Store_From] = "Store B"
        OR t.[Store_To] = "Store B"
        )
    AND t.[Item_Name] = "Item 2"
ORDER BY t.[T_Date];

【问题讨论】:

【参考方案1】:
select  T1.id ,IIF(Store_From = 'Store B',Store_To, Store_From) ,IIF(Store_To = 'Store B',0, Amount) AS Dispatched, IIF(Store_From = 'Store B',0, Amount) AS Received,SUM(T.Received) AS RemainingBal
  From track  as T1

left join (

select  id,(-IIF(Store_To = 'Store B',0, Amount) + IIF(Store_From = 'Store B',0, Amount) ) AS Received
  From track 

) as  T ON T.id <= T1.id

WHERE   Item_Id = 'Item_2'
        AND ( Store_From = 'Store B'
              OR Store_To = 'Store B'
            )

GROUP BY 
        T1.Store_From ,
        T1.Store_To,T1.id,Amount
        ORDER BY T1.id

【讨论】:

【参考方案2】:
SELECT  id ,
        CASE WHEN Store_From = 'Store B' THEN Store_To
             ELSE Store_From
        END AS Location_To ,
        CASE WHEN Store_To = 'Store B' THEN 0
             ELSE Amount
        END AS Dispatched ,
        CASE WHEN Store_From = 'Store B' THEN 0
             ELSE Amount


        END AS Received
INTO    #Tmp
FROM    dbo.Tracking
WHERE   Item_Id = 'Item_2'
        AND ( Store_From = 'Store B'
              OR Store_To = 'Store B'
            )

SELECT  T1.Location_To ,       
        T1.Received ,T1.Dispatched ,
        SUM(T.Dispatched) AS RemainingBal
FROM    #Tmp AS T1
        LEFT JOIN ( SELECT  ISNULL(( -CAST(Dispatched AS INT) + CAST(Received AS INT) ),
                                   0) AS Dispatched ,
                            id
                    FROM    #Tmp
                  ) AS T ON T.id <= T1.id
GROUP BY T1.Location_To ,
        T1.Dispatched ,
        T1.Received

【讨论】:

我在查询表达式'CASE WHEN Store_From = 'Store B' THEN Store_To ELSE Store_From END AS Location_To'中收到错误消息“语法错误(缺少运算符)”。所以我尝试了vba代码。创建 Tmp 查询就可以了。但我在 vba 代码中收到错误消息以创建“Store_rec 查询”。 "SELECT T1.Location_To, T1.Received ,T1.Dispatched , SUM(T.Dispatched) As RemainingBal FROM Tmp AS T1 LEFT JOIN ( SELECT ISNULL(( -CAST(Dispatched AS INT) + CAST(Received AS INT) ), 0) AS Dispatched , id FROM Tmp) AS T ON T.id &lt;= T1.id GROUP BY T1.Location_To ,T1.Dispatched ,T1.Received"中的错误【参考方案3】:

感谢您对我的帮助。我在上面提供的代码中编辑了一些点。代码如下

SELECT T1.TDate,IIF(T1.Store_From = 'Store B',T1.Store_To, T1.Store_From) AS Location, IIF(T1.Store_From = 'Store B',0, T1.Amount) AS Received, IIF(T1.Store_To = 'Store B',0, T1.Amount) AS Dispatched, SUM(T.Received) AS Balance FROM Tracking AS T1 LEFT JOIN (SELECT aa.id, aa.TDate, (-IIF(aa.Store_To = 'Store B',0, aa.Amount) + IIF(aa.Store_From = 'Store B',0, aa.Amount) ) AS Received FROM Tracking AS aa WHERE aa.Item_Name = 'Item 2')  AS T ON T.id <= T1.id WHERE Item_Name = 'Item 2' AND (Store_From = 'Store B' OR Store_To = 'Store B') GROUP BY T1.TDate,T1.Store_From, T1.Store_To, T1.id, Amount ORDER BY T1.TDate;

【讨论】:

以上是关于难以获取以前的查询记录的主要内容,如果未能解决你的问题,请参考以下文章