【问题标题】:Counting number of occurrences BEFORE row [duplicate]计算行前出现的次数[重复]
【发布时间】:2018-10-22 12:24:20
【问题描述】:

我对 SQL 还很陌生,所以我不确定这是否可行。我有一个分层数据库,我正在尝试构建一个查询,该查询将按此层次结构对结果进行排序。

我不能按“TreeLevel”列排序(请参见下面的示例),因为这样孩子将与父母分开。此外,所需的顺序取决于各种表中的不同列,因此就我目前的知识而言,cte 变得更加复杂。

+-----------+---------+-------------+
| TreeLevel |  Code   | Parent Code |
+-----------+---------+-------------+
|         1 |  0770.1 |             |
|         2 | 0770.50 |      0770.1 |
|         3 |  0804.5 |     0770.50 |
|         2 | 0770.12 |      0770.1 |
|         1 |  0891.1 |             |
|         2 |    0980 |      0891.1 |
+-----------+---------+-------------+

我想通过确定 TreeLevel AT 每行的出现次数来进行排序。因此,对于 TreeLevel 中的第二个“2”,这个数字应该是 2。但是,对于第三个 2,这个数字应该是 3。这有可能吗?

提前致谢

编辑:

这是我现在拥有的 SQL:

Select ChildComp.TreeLevel, 
ChildComp.Code, 
ISNULL(ChildComp.Specification, '') AS Specification,
dbo.stkCommodities.Code as 'Stock Item Commodity Code', 
CASE WHEN ISNULL(dbo.stkCategories.Code,'') = 'SA-NP' THEN 'SA-NP' ELSE '' END AS 'Category Code', 
ChildComp.Quantity,
LEFT(ChildComp.Description, CHARINDEX(' -', ChildComp.Description, 1))  as posnr, 
stkStockItems.Description as 'Stock Item Description',
ParentComp.Code AS 'Parent Component Code',
CASE WHEN ISNULL(ChildComp.Specification, '') = '' Then ParentComp.Code Else CONCAT(ParentComp.Code, '_', ISNULL(ChildComp.Specification, '')) END AS 'Component Code + Rev'
From dbo.astComponents AS ChildComp
LEFT Join dbo.astAssets ON ChildComp.AssetId = astAssets.Id 
LEFT Join dbo.stkStockItems ON ChildComp.Code = stkStockItems.Code
LEFT Join dbo.stkCommodities ON stkStockItems.CommodityId = stkCommodities.Id
LEFT Join dbo.stkCategories ON stkStockItems.CategoryId = stkCategories.Id
LEFT Join dbo.astComponents AS ParentComp ON ChildComp.ParentComponentId = ParentComp.Id
LEFT Join dbo.stkStockItems As ParentItems ON ParentComp.Code = ParentItems.Code
LEFT Join dbo.stkCommodities AS ParentCom ON ParentItems.CommodityId = ParentCom.Id
Where astAssets.Code = '2018010084' AND (dbo.stkCommodities.Code <> 'RM' OR dbo.stkCommodities.Code IS NULL ) AND
(ParentCom.Code <> 'WA' OR ParentCom.Code IS NULL )

表格:

dbo.astComponents

dbo.astAssets

dbo.stkStockItems

dbo.stkCommodities

dbo.stkCategories

很抱歉将表格共享为链接,但这些表格确实很长

【问题讨论】:

  • 那么,对于您的示例数据,您的顺序是什么?
  • 我要的顺序如示例所示。
  • 如何使用递归选择获得当前结果?
  • 我目前没有任何按我想要的方式排序的结果,否则我不会问! :) 我正在考虑做一个 ORDER BY CASE
  • 您所显示的是预期的结果。那么你能告诉我们样本数据是什么样子的吗?

标签: sql sql-server tsql count


【解决方案1】:

您可以使用递归 CTE:

with cte as (
      select 1 as lev, code, parent
      from t
      where parent is null
      union all
      select lev + 1, t.code, t.parent
      from cte join
           t
           on t.parent = cte.code
     )
select *
from cte;

【讨论】:

  • Gordon,就像我提到的那样,我已经研究了 cte,但我似乎无法让它们工作,因为顺序取决于不同表中的不同列。我不仅需要在 TreeLevel 上订购,还需要在位置 nr 上订购。同时还查看(父)代码。
猜你喜欢
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多