SQL Server:计算SQL查询中的顺序

沙沙语

我在SQL Server 2008R2中具有以下四个表:

DECLARE @ParentGroup TABLE (ParentGroup_ID INT, ParentGroup_Name VARCHAR(100));
DECLARE @ChildGroup TABLE (ChildGroup_id INT, ChildGroup_name VARCHAR(100), ParentGroup_id INT);
DECLARE @Entity TABLE ([Entity_id] INT, [Entity_name] VARCHAR(100));
DECLARE @ChildGroupEntity TABLE (ChildGroupEntity_id INT, ChildGroup_id INT, [Entity_ID] INT);
INSERT INTO @parentGroup VALUES (1, 'England'), (2, 'USA');
INSERT INTO @ChildGroup VALUES (10, 'Sussex', 1), (11, 'Essex', 1), (12, 'Middlesex', 1);
INSERT INTO @entity VALUES (100, 'Entity0'),(101, 'Entity1'),(102, 'Entity2'),(103, 'Entity3'),(104, 'Entity4'),(105, 'Entity5'),(106, 'Entity6');
INSERT INTO @ChildGroupEntity VALUES (1000, 10, 100), (1001, 10, 101), (1002, 10, 102), (1003, 11, 103), (1004, 11, 104), (1005, 12, 100), (1006, 12, 105), (1007, 12, 106);
/*
SELECT * FROM @parentGroup
SELECT * FROM @ChildGroup
SELECT * FROm @entity
SELECT * FROM @ChildGroupEntity
*/

表之间的关系如下:

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name],  0 [ChildGroupSequence], 0 [EntitySequence]
FROM @ChildGroupEntity cge
INNER JOIN @ChildGroup cg ON cg.ChildGroup_id=cge.ChildGroup_id
INNER JOIN @parentGroup pg ON pg.parentGroup_id=cg.parentGroup_id
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID]
ORDER BY ParentGroup_Name, ChildGroup_name, [Entity_name]

上面查询的输出是:

-------------------------------------------------------------------------------
ParentGroup_Name|ChildGroup_name|Entity_name|ChildGroupSequence|EntitySequence|
-------------------------------------------------------------------------------
England         |Essex          |Entity3    |0                 |0             |
England         |Essex          |Entity4    |0                 |0             |
England         |Middlesex      |Entity0    |0                 |0             |
England         |Middlesex      |Entity5    |0                 |0             |
England         |Middlesex      |Entity6    |0                 |0             |
England         |Sussex         |Entity0    |0                 |0             |
England         |Sussex         |Entity1    |0                 |0             |
England         |Sussex         |Entity2    |0                 |0             |
-------------------------------------------------------------------------------

现在,我想找出父组1的子组和与这些子组相关联的所有实体。此外,我想按以下逻辑计算[ChildGroupSequence],[EntitySequence]:

  1. ChildGroupSequence列应代表父组中子组的序列,从1000开始并递增100。即,第一个子组为1000,第二个子组为1100。
  2. EntitySequence列应代表子组中的实体序列,从100开始并以一位数字递增,并为每个子组重置。也就是说,子组1中的第一个实体从100开始,子组2中的第一个实体也从100开始。

因此,输出应采用以下格式:

-------------------------------------------------------------------------------
ParentGroup_Name|ChildGroup_name|Entity_name|ChildGroupSequence|EntitySequence|
-------------------------------------------------------------------------------
England         |Essex          |Entity3    |1000              |100           |
England         |Essex          |Entity4    |1000              |101           |
England         |Middlesex      |Entity0    |1100              |100           |
England         |Middlesex      |Entity5    |1100              |101           |
England         |Middlesex      |Entity6    |1100              |102           |
England         |Sussex         |Entity0    |1200              |100           |
England         |Sussex         |Entity1    |1200              |101           |
England         |Sussex         |Entity2    |1200              |102           |
-------------------------------------------------------------------------------

我可以通过将值读取到应用程序层(.Net程序)中来轻松实现此目的,但是希望通过尝试一些类似的小事情来学习SQL Server。有人可以帮我编写此SQL查询吗?

任何帮助将非常感激。提前致谢。

编辑:我的样本数据似乎没有正确反映第一个规则,该规则指出ChildGroupSequence应该增加100,样本输出增加1。第二个查询反映出增加100。@jpw:非常感谢指出这一点。

w

我相信可以使用以下分区排名功能来实现

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name], 
    999 + DENSE_RANK() OVER(PARTITION BY ParentGroup_Name ORDER BY ChildGroup_name) AS [ChildGroupSequence], 
    99 + ROW_NUMBER() OVER(PARTITION BY ParentGroup_Name, ChildGroup_name ORDER BY ChildGroup_name, Entity_name) AS [EntitySequence]
FROM @ChildGroupEntity cge
INNER JOIN @ChildGroup cg ON cg.ChildGroup_id=cge.ChildGroup_id
INNER JOIN @parentGroup pg ON pg.parentGroup_id=cg.parentGroup_id
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID]
ORDER BY ParentGroup_Name, ChildGroup_name, [Entity_name]

该查询生成您描述的样本输出。您的样本数据似乎不能正确反映第一条规则,因为该规则指出ChildGroupSequence应该增加100,样本输出应增加1。第二个查询反映出增加100:

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name], 
    900 + 100 * DENSE_RANK() OVER(PARTITION BY ParentGroup_Name ORDER BY ChildGroup_name) AS [ChildGroupSequence], 
    99 + ROW_NUMBER() OVER(PARTITION BY ParentGroup_Name, ChildGroup_name ORDER BY ChildGroup_name, Entity_name) AS [EntitySequence]
FROM @ChildGroupEntity cge
INNER JOIN @ChildGroup cg ON cg.ChildGroup_id=cge.ChildGroup_id
INNER JOIN @parentGroup pg ON pg.parentGroup_id=cg.parentGroup_id
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID]
ORDER BY ParentGroup_Name, ChildGroup_name, [Entity_name]

请参阅此示例SQL Fiddle以获取这两个查询的示例。

也许查询应该按ID而不是名称进行分区,如果这样,Sussex将在Essex之前出现,因为它具有较低的ID,并且查询如下:

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name], 
    900 + 100 * DENSE_RANK() OVER(PARTITION BY pg.ParentGroup_ID ORDER BY cg.ChildGroup_ID) AS [ChildGroupSequence], 
    99 + ROW_NUMBER() OVER(PARTITION BY pg.ParentGroup_ID, cg.ChildGroup_ID ORDER BY cg.ChildGroup_ID, cge.Entity_ID) AS [EntitySequence]
FROM @ChildGroupEntity cge
INNER JOIN @ChildGroup cg ON cg.ChildGroup_id=cge.ChildGroup_id
INNER JOIN @parentGroup pg ON pg.parentGroup_id=cg.parentGroup_id
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID]
ORDER BY pg.ParentGroup_ID, cg.ChildGroup_ID, [Entity_name]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server 查询中 AND 和 OR 的操作顺序

来自分类Dev

SQL Server查询以按顺序计算一栏中更改值的数量

来自分类Dev

SQL Server查询,按列中的大数字顺序

来自分类Dev

在SQL查询中禁用顺序

来自分类Dev

查询中的SQL行顺序

来自分类Dev

SQL Server中的查询

来自分类Dev

SQL Server中的更新顺序

来自分类Dev

SQL Server:查询顺序子行

来自分类Dev

SELECT查询中的默认行顺序-SQL Server 2008与SQL 2012

来自分类Dev

如何在SQL查询中不包括计算以免违反数学运算顺序(PEDMAS)?

来自分类Dev

SQL连接及其在查询中的列出顺序

来自分类Dev

关于SQL查询中执行顺序的困惑

来自分类Dev

SQL Server中的累积计算

来自分类Dev

SQL Server中的计算列

来自分类Dev

SQL Server中的交叉计算

来自分类Dev

SQL查询执行顺序

来自分类Dev

SQL查询操作顺序

来自分类Dev

SQL 查询子句的顺序

来自分类Dev

SQL查询顺序

来自分类Dev

如何计算在T-SQL,SQL Server中花费的时间(Timestamp)查询

来自分类Dev

SQL Server中的摘要查询

来自分类Dev

Access中的SQL Server查询

来自分类Dev

SQL Server中的查询优化

来自分类Dev

在SQL Server中查询WITH子句

来自分类Dev

SQL Server查询中的过程

来自分类Dev

在SQL Server中按顺序分组

来自分类Dev

在SQL Server中按顺序分组

来自分类Dev

SQL Server 中的自定义顺序

来自分类Dev

sql server查询显示错误,语法错误,顺序接近