Sql server 2008 r2 SQL Server递归查询·

Sql server 2008 r2 SQL Server递归查询·,sql-server-2008-r2,Sql Server 2008 R2,我在SQLServer2008R2中有一个表,其中包含产品订单。在大多数情况下,每个产品只有一个条目 ID | Prod | Qty ------------ 1 | A | 1 4 | B | 1 7 | A | 1 8 | A | 1 9 | A | 1 12 | C | 1 15 | A | 1 16 | A | 1 21 | B | 1 我想基于如下所示的表创建一个视图 ID | Prod | Qty ----------

我在SQLServer2008R2中有一个表,其中包含产品订单。在大多数情况下,每个产品只有一个条目

ID | Prod | Qty
------------
1  | A    | 1
4  | B    | 1
7  | A    | 1
8  | A    | 1
9  | A    | 1
12 | C    | 1
15 | A    | 1
16 | A    | 1
21 | B    | 1
我想基于如下所示的表创建一个视图

ID | Prod | Qty
------------------
1  | A    | 1
4  | B    | 1
9  | A    | 3
12 | C    | 1
16 | A    | 2
21 | B    | 1
我已经用一个表表达式编写了一个查询,但如何使其工作却让我感到困惑。下面的sql实际上不起作用,但只是我正在尝试做的一个示例。我已经用多种不同的方法编写了这个查询,但无法找出如何获得正确的结果。我使用row_number生成一个顺序id。从中,我可以排序和比较连续的行,以查看下一行是否与前一行具有相同的产品,因为ReleaseId是顺序的,但不一定是连续的

;with myData AS
(
  SELECT
    row_number() over (order by a.ReleaseId) as 'Item',
    a.ReleaseId,
    a.ProductId,
    a.Qty
  FROM OrdersReleased a

  UNION ALL

  SELECT
    row_number() over (order by b.ReleaseId) as 'Item',
    b.ReleaseId,
    b.ProductId,
    b.Qty
  FROM  OrdersReleased b
  INNER JOIN myData c ON b.Item = c.Item + 1 and b.ProductId = c.ProductId                           
)
SELECT * from myData

通常,您会从这样的内容中删除ID,因为它是一个摘要

  SELECT a.ProductId,
    SUM(a.Qty) AS Qty
  FROM OrdersReleased a
  GROUP BY a.ProductId
  ORDER BY a.ProductId
-如果你想做子查询,如果你没有一个非常大的数据集,你可以把它作为一个列来做

SELECT a.ProductId,
       SUM(a.Qty) AS Qty,
       (SELECT COUNT(1)
           FROM OrdersReleased b
           WHERE b.ReleasedID - 1 = a.ReleasedID
           AND b.ProductId = b.ProductId) as NumberBackToBack
  FROM OrdersReleased a
  GROUP BY a.ProductId
  ORDER BY a.ProductId

我不确定我是否明白。行号加上ProductId建立记录之间的关系。我同意可以从最终选择中删除它,但不确定在没有它的情况下如何使查询工作。请尝试更改我的SQL以适合您的姓名。第三列不是不需要行号吗?它只是ReleaseId不一定是连续的,所以b.Id-1=a.Id不总是成立的,这就是为什么我必须添加行号。我不清楚你想要什么。计数为2或更多的东西不都算是连续的吗?虽然很接近,但它遇到的问题与我一直遇到的问题相同。如果记录是连续的,则选择COUNT1将标记该记录,但不会合计数量。您的查询也缺少GROUP BY子句。我希望评论部分支持问题部分的格式-选择a.ProductId,SUMa.Qty作为数量,从OrdersReleaseB中选择COUNT1,其中a.ReleaseID-1=b.ReleaseID和b.ProductId=a.ProductId作为编号从OrdersReleaseId组中选择BacktoBack,a.ReleaseID作为替代,我试过这样写;使用myData作为订单的行号,按ord.ReleaseId作为“项目”,ord.ReleaseId,ord.ProductId,ord.Qty从订单中选择maxc.ReleaseId作为“发布”,c.ProductId,将myData c中的数量汇总为“数量”,将myData d与d.Item=c.Item+1和d.productid=c.productid按c.Item分组,c.releaseid、c.productid、c.Qty按c.releaseid排序