Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用父值和混合列类型的动态顺序_Sql_Sql Server_Tsql_Sql Order By - Fatal编程技术网

Sql 使用父值和混合列类型的动态顺序

Sql 使用父值和混合列类型的动态顺序,sql,sql-server,tsql,sql-order-by,Sql,Sql Server,Tsql,Sql Order By,我有一个名为Report的表,Report中的列如下所示: Id(char) Name(char) ParentId(char) Sequence(int) SortBy(char) 该表有一些层次结构。每行的ParentId是另一行的ID。顶层层次结构的ParentId为NULL。SortBy字段是名称或序列 现在我想从报告中获取一个SELECT*FROM。我想要得到的结果是按ParentId分组,但在每个组中,它都按SortBy排序,其中SortBy

我有一个名为Report的表,Report中的列如下所示:

Id(char)     
Name(char)     
ParentId(char)     
Sequence(int)     
SortBy(char)
该表有一些层次结构。每行的ParentId是另一行的ID。顶层层次结构的ParentId为NULL。SortBy字段是名称或序列

现在我想从报告中获取一个SELECT*FROM。我想要得到的结果是按ParentId分组,但在每个组中,它都按SortBy排序,其中SortBy的值在Id=此组的ParentId行中

更具体地说,如果组的ParentId是animal,则Id为animal的行的排序是Name,我希望该组按名称排序

有人能帮忙吗?非常感谢您抽出时间

您可以使用order by中的大小写按父级动态排序。您的案例中唯一棘手的问题是,您可以排序的列是不同的数据类型。在这种情况下,必须将它们转换为公共数据类型

select r.*
from Report r
    left join Report p on p.ID = r.ParentID
order by r.ParentID,
    case p.SortBy
        when 'Sequence' then right('0000000000' + cast(r.Sequence as varchar(10)), 10)
        else r.Name
    end
查询 查询很简单。左键连接到父级,并使用父级确定案例中的第二个排序参数。第一个排序参数是parentId,它将子项分组在一起

处理顺序有两种方法。您可以将其转换为varachar并使用pad,或者添加第三个排序参数。执行计划中没有任何更改,但我希望如果序列列有索引,则按类型按列分隔订单会更好

替代订货人

设置代码 输出 您可以使用order by中的案例按父级动态排序。您的案例中唯一棘手的问题是,您可以排序的列是不同的数据类型。在这种情况下,必须将它们转换为公共数据类型

查询 查询很简单。左键连接到父级,并使用父级确定案例中的第二个排序参数。第一个排序参数是parentId,它将子项分组在一起

处理顺序有两种方法。您可以将其转换为varachar并使用pad,或者添加第三个排序参数。执行计划中没有任何更改,但我希望如果序列列有索引,则按类型按列分隔订单会更好

替代订货人

设置代码 输出
这是一个使用秩和并集的替代选项


这是一个使用秩和并集的替代选项


order by cluse中可以有一个case语句-这听起来很难听。一些数据示例可能会有所帮助。您是否希望SortBy字段的内容与表列名称/序列相关,从而影响SQL中的排序顺序?您是说SortBy包含要排序的列的名称?order by cluse可以有一个case语句-这听起来很难听。一些数据示例会有帮助您是否希望SortBy字段的内容与表列名称/序列相关,从而影响SQL中的排序顺序?您是说SortBy包含要排序的列的名称?谢谢!你的答案也很有用!感谢你的答案也很有用!
SELECT Child.*
FROM #Report [Child]
LEFT JOIN #Report [Parent] ON Parent.Id = Child.ParentId
ORDER BY 
    Child.ParentId,
    CASE Parent.SortBy WHEN 'Name' THEN Child.Name END,
    Sequence -- sort by sequence if no column is matched
ORDER BY 
    Child.ParentId,
    CASE Parent.SortBy
        WHEN 'Name' THEN Child.Name
        ELSE RIGHT('0000000000' + CAST(Child.Sequence AS VARCHAR), 10)
    END
IF EXISTS (SELECT * FROM tempdb.sys.objects WHERE NAME LIKE '#Report%') 
    DROP TABLE #Report;

CREATE TABLE #Report
(
    Id CHAR(20),     
    Name CHAR(20),
    ParentId CHAR(20),
    Sequence INT,
    SortBy CHAR(20)
);

INSERT INTO #Report VALUES
('a', 'zName', 'f', 2, ''),
('b', 'bName', 'f', 3, ''),
('c', 'cName', 'g', 7, ''),
('d', 'dName', 'g', 5, ''),
('e', 'eName', 'g', 6, ''),
('f', 'fName', '', 9, 'Name'),
('g', 'gName', '', 8, 'Sequence');
Id  Name    ParentId    Sequence    SortBy
f   fName               9           Name                
g   gName               8           Sequence            
b   bName    f          3                       
a   zName    f          2                       
d   dName    g          5                       
e   eName    g          6                       
c   cName    g          17              
SELECT Child.*, RANK() OVER (PARTITION BY Child.ParentID ORDER BY Child.Sequence) AS Ranked
FROM Report Child
LEFT JOIN Report Parent  ON Parent.ID = Child.ParentID
WHERE Parent.SortBy = 'Sequence'
ORDER BY Child.ParentID, Ranked
SELECT Child.*, RANK() OVER (PARTITION BY Child.ParentID ORDER BY Child.Name) AS Ranked
FROM Report Child
LEFT JOIN Report Parent  ON Parent.ID = Child.ParentID
WHERE Parent.SortBy = 'Name'
ORDER BY Child.ParentID, Ranked