从聚合自联接创建视图

时间:2012-07-24 17:15:39

标签: sql sql-server join aggregate-functions self-join

我现在已经工作了大约两周,为我工作的公司建立了一些详细的报告选项。我在上周或前一周的某个时间问了一个问题,这让我开始查询,我最终收紧了。

我从一个库存分类帐开始,它只跟踪单个交易。我们的目标是建立一个更彻底的分类账,它将保持一个正在运行的库存总额,一个正在运行的销售总额,如果一个项目缺货,它将跟踪重新供应的天数。

在对聚合列进行自联接之前,初始查询使用With ... as语句来定义具有聚合的表。不幸的是,我不能做同样的事情来创建一个视图,所以我需要找到一种方法来创建不同的聚合,这仍然允许我自我加入它们以保持我的总数有序。

到目前为止,我是如何重新调整我的陈述的。

Create View 'QLedger' as
Select tcum.txnid,
        tcum.Item, 
        tcum.TxnDate, 
        tcum.[Tran Type], 
        tcum.Quantity,
        tcum.cumq 

 from (select *, SUM( Quantity ) 
            OVER (PARTITION BY InventoryLedger.Item 
            ORDER BY InventoryLedger.TxnID
            ROWS UNBOUNDED PRECEDING ) cumq, 
            abs( 
                sum( 
                    case when [Tran Type] = 'Shipping' 
                    or [Tran Type] = 'Customer Return' 
                    then Quantity end) 
                    over (partition by qryrptInventoryLedger.item 
                            order by InventoryLedger.txnid 
                                    rows unbounded preceding)) LifeSales
            from InventoryLedger) tcum 
 left outer join InventoryLedger tcumnext
 on tcum.Item = tcumnext.Item
 and tcum.TxnID < tcumnext.TxnID 
 and
 tcum.cumq = 0 and tcumnext.cumq >0
 where tcum.Item = '103-02'
 and tcum.cumq = 0
 group by tcum.TxnID, tcum.TxnDate, tcum.Item, tcum.[tran type], tcum.Quantity

这几乎是正确的,除了我自己加入的表(tcumnext)没有与tcum比较的运行/累积数量列。我根本无法弄清楚如何与之进行比较。谁能帮我吗?我真的很感激。这样做是令人兴奋和令人沮丧的,在这么长时间工作之后如此接近。

2 个答案:

答案 0 :(得分:1)

如果您已在查询中使用with解决了聚合函数问题,则也可以使用视图解决此问题。

以下是使用包含聚合函数的with子句的视图示例:

http://social.msdn.microsoft.com/Forums/sk/sqlgetstarted/thread/302040c6-6a1b-4f99-8a1d-84bb196cb5e6

首先发布。

希望这有助于=)

答案 1 :(得分:0)

您可以在视图中使用 with 语句:

create view xxx as
    with <blah blah blah>
    select <your query>

这会解决您的问题吗?