获取销售代表及其所在的位置

时间:2011-11-10 20:44:26

标签: sql-server tsql

    TerritoryId, Description, ParentTerritoryId, Type 
--------------------------------------------------------
    1, UnitedStates, null, Territory 
    1, John Smith, 1, Sales Rep 
    2, Georgia, 1, Territory
    2, Jane Doe, 2, Sales Rep 
    2, Ann Smith, 2, Sales Rep

如何编写以下T-SQL?假设我正在寻找像“安·史密斯”这样的名字。

我希望结果集看起来像:

1, United States, null, Territory
2, Georgia, 1, Territory
2, Ann Smith, 2, Sales Rep

基本上,我想找到一个销售代表或销售代表,以及他们属于哪个组织。

2 个答案:

答案 0 :(得分:2)

假设SQL Server 2005+所以我们可以使用recursive CTE并假设TerritoryId值应该是唯一的:

TerritoryId  Description   ParentTerritoryId  Type 
--------------------------------------------------------
1            UnitedStates  NULL               Territory 
2            John Smith    1                  Sales Rep 
3            Georgia       1                  Territory
4            Jane Doe      3                  Sales Rep 
5            Ann Smith     3                  Sales Rep

然后你可以这样做:

WITH cteRecursion AS (
    SELECT TerritoryId, Description, ParentTerritoryId, Type, 1 AS Level
        FROM YourTable 
        WHERE Description = 'Ann Smith'
    UNION ALL
    SELECT t.TerritoryId, t.Description, t.ParentTerritoryId, t.Type, c.Level + 1
        FROM YourTable t
            INNER JOIN cteRecursion c
                ON t.TerritoryId = c.ParentTerritoryId
)
SELECT TerritoryId, Description, ParentTerritoryId, Type 
    FROM cteRecursion 
    ORDER BY Level DESC;

答案 1 :(得分:0)

虽然理想情况下可以在表格中使用多级结构,但您可能希望拆分表格。

一张领土表和一张销售代表。

如果您的销售代表可以拥有多个区域,则需要转到3个表格 一个用于销售代表,一个用于区域,另一个用于查找表。

如果您要执行多级表,则需要每个条目都具有唯一ID