Sql server SQL Server-显示数据“向下”

Sql server SQL Server-显示数据“向下”,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一张这样的桌子: CREATE TABLE #Categories (CategoryText VARCHAR(50), CategoryUrl VARCHAR(50), SubCategoryText VARCHAR(50), SubCategoryUrl VARCHAR(50)) INSERT INTO #Categories SELECT 'Lighting', 'http://lighting.com', 'Chandeliers', 'http://chandeliers.com'

我有一张这样的桌子:

CREATE TABLE #Categories (CategoryText VARCHAR(50), CategoryUrl VARCHAR(50), SubCategoryText VARCHAR(50), SubCategoryUrl VARCHAR(50))
INSERT INTO #Categories SELECT 'Lighting', 'http://lighting.com', 'Chandeliers', 'http://chandeliers.com' 
INSERT INTO #Categories SELECT 'Lighting', 'http://lighting.com', 'Lamps', 'http://lamps.com' 
INSERT INTO #Categories SELECT 'Hardware', 'http://hardware.com', 'Hooks', 'http://hooks.com' 
INSERT INTO #Categories SELECT 'Hardware', 'http://hardware.com', 'Hinges', 'http://hinges.com' 
这看起来像:

CategoryText                                       CategoryUrl                                        SubCategoryText                                    SubCategoryUrl
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
Lighting                                           http://lighting.com                                Chandeliers                                        http://chandeliers.com
Lighting                                           http://lighting.com                                Lamps                                              http://lamps.com
Hardware                                           http://hardware.com                                Hooks                                              http://hooks.com
Hardware                                           http://hardware.com                                Hinges                                             http://hinges.com
我将如何动态显示数据,如下所示:

Type        Text                                               Url
----------- -------------------------------------------------- --------------------------------------------------
Category    Lighting                                           http://lighting.com
SubCategory Chandeliers                                        http://chandeliers.com
SubCategory Lamps                                              http://lamps.com
Category    Hardware                                           http://hardware.com
SubCategory Hinges                                             http://hinges.com
SubCategory Hooks                                              http://hooks.com
我还需要保持类别和子类别的正确顺序

我想到了UNPIVOT,但我不知道如何在这里应用它,因为数据结构/需求与大多数示例不同

感谢您的帮助。

尝试以下方法:

select distinct
  Type = 'Category',
  Parent = CategoryText,
  Text = CategoryText,
  Url = CategoryUrl
from #Categories
union all
select 
  Type = 'SubCategory',
  Parent = CategoryText,
  Text = SubCategoryText,
  Url = SubCatgoryUrl
from  #Categories
order by Parent,Type,Text
试试这个:

select distinct
  Type = 'Category',
  Parent = CategoryText,
  Text = CategoryText,
  Url = CategoryUrl
from #Categories
union all
select 
  Type = 'SubCategory',
  Parent = CategoryText,
  Text = SubCategoryText,
  Url = SubCatgoryUrl
from  #Categories
order by Parent,Type,Text

这应该适用于你…使用具有排名功能的联合

select CASE WHEN SubCategoryText IS NULL THEN 'Category' ELSE 'SubCategory' END as Type,
        CASE WHEN SubCategoryText IS NULL THEN CategoryText ELSE SubCategoryText END as Type,
        CategoryUrl
from (      
select *, RANK() OVER (ORDER BY CategoryText, SubCategoryText) AS Rank
from (
select CategoryText, null as SubCategoryText, CategoryUrl
from #Categories
union 
select CategoryText, SubCategoryText, SubCategoryUrl
from #Categories
)a)b
order by Rank

这应该适用于你…使用具有排名功能的联合

select CASE WHEN SubCategoryText IS NULL THEN 'Category' ELSE 'SubCategory' END as Type,
        CASE WHEN SubCategoryText IS NULL THEN CategoryText ELSE SubCategoryText END as Type,
        CategoryUrl
from (      
select *, RANK() OVER (ORDER BY CategoryText, SubCategoryText) AS Rank
from (
select CategoryText, null as SubCategoryText, CategoryUrl
from #Categories
union 
select CategoryText, SubCategoryText, SubCategoryUrl
from #Categories
)a)b
order by Rank

我保持了类别和子类别的顺序,使这项工作得以进行

我使用@SliverNinja的CASE语句来获得正确的类型和文本

对于排序,我添加了两列CategorySortOrder和SubCategorySortOrder。我组合了类别和子类别排序器来创建一个新的单排序器列。然后,我按照该列进行分组和排序,以获得最终结果

CREATE TABLE #Categories (CategoryText VARCHAR(50), CategoryUrl VARCHAR(50), CategorySortOrder INT,SubCategoryText VARCHAR(50), SubCategoryUrl VARCHAR(50), SubCategorySortOrder INT)
INSERT INTO #Categories SELECT 'Lighting', 'http://lighting.com', 1, 'Chandeliers', 'http://chandeliers.com',1
INSERT INTO #Categories SELECT 'Lighting', 'http://lighting.com', 1, 'Lamps', 'http://lamps.com' , 2
INSERT INTO #Categories SELECT 'Hardware', 'http://hardware.com', 2 ,'Hooks', 'http://hooks.com' ,1
INSERT INTO #Categories SELECT 'Hardware', 'http://hardware.com', 2,'Hinges', 'http://hinges.com' ,2

SELECT
    Type
    , Text
    , Url
    , MIN(SortOrder)[SortOrder]
INTO 
    #cats
FROM
    (
    SELECT 
        CASE WHEN SubCategoryText IS NULL THEN 'Category' ELSE 'SubCategory' END [Type]
        , CASE WHEN SubCategoryText IS NULL THEN CategoryText ELSE SubCategoryText END [Text]
        , [Url]
        , CASE WHEN SubCategoryText IS NULL THEN CAST(CAST(CategorySortOrder AS VARCHAR) + CAST(SubCategorySortOrder AS VARCHAR) AS NUMERIC)  ELSE CAST(CAST(CategorySortOrder AS VARCHAR) + CAST(SubCategorySortOrder AS VARCHAR) AS NUMERIC) + 1 END[SortOrder]
    FROM
        (
            SELECT
                CategoryText
                , NULL [SubCategoryText]
                , CategoryUrl [Url]
                , CategorySortOrder
                , SubCategorySortOrder
            FROM
                #Categories
            UNION ALL
            SELECT
                CategoryText
                , SubCategoryText
                , SubCategoryUrl
                , CategorySortOrder
                , SubCategorySortOrder
            FROM
                #Categories
        )t
    )t
GROUP BY
    Type
    , Text
    , Url
ORDER BY
    SortOrder 

SELECT 
    Type
    , Text
    , Url
FROM
    #Cats

我保持了类别和子类别的顺序,使这项工作得以进行

我使用@SliverNinja的CASE语句来获得正确的类型和文本

对于排序,我添加了两列CategorySortOrder和SubCategorySortOrder。我组合了类别和子类别排序器来创建一个新的单排序器列。然后,我按照该列进行分组和排序,以获得最终结果

CREATE TABLE #Categories (CategoryText VARCHAR(50), CategoryUrl VARCHAR(50), CategorySortOrder INT,SubCategoryText VARCHAR(50), SubCategoryUrl VARCHAR(50), SubCategorySortOrder INT)
INSERT INTO #Categories SELECT 'Lighting', 'http://lighting.com', 1, 'Chandeliers', 'http://chandeliers.com',1
INSERT INTO #Categories SELECT 'Lighting', 'http://lighting.com', 1, 'Lamps', 'http://lamps.com' , 2
INSERT INTO #Categories SELECT 'Hardware', 'http://hardware.com', 2 ,'Hooks', 'http://hooks.com' ,1
INSERT INTO #Categories SELECT 'Hardware', 'http://hardware.com', 2,'Hinges', 'http://hinges.com' ,2

SELECT
    Type
    , Text
    , Url
    , MIN(SortOrder)[SortOrder]
INTO 
    #cats
FROM
    (
    SELECT 
        CASE WHEN SubCategoryText IS NULL THEN 'Category' ELSE 'SubCategory' END [Type]
        , CASE WHEN SubCategoryText IS NULL THEN CategoryText ELSE SubCategoryText END [Text]
        , [Url]
        , CASE WHEN SubCategoryText IS NULL THEN CAST(CAST(CategorySortOrder AS VARCHAR) + CAST(SubCategorySortOrder AS VARCHAR) AS NUMERIC)  ELSE CAST(CAST(CategorySortOrder AS VARCHAR) + CAST(SubCategorySortOrder AS VARCHAR) AS NUMERIC) + 1 END[SortOrder]
    FROM
        (
            SELECT
                CategoryText
                , NULL [SubCategoryText]
                , CategoryUrl [Url]
                , CategorySortOrder
                , SubCategorySortOrder
            FROM
                #Categories
            UNION ALL
            SELECT
                CategoryText
                , SubCategoryText
                , SubCategoryUrl
                , CategorySortOrder
                , SubCategorySortOrder
            FROM
                #Categories
        )t
    )t
GROUP BY
    Type
    , Text
    , Url
ORDER BY
    SortOrder 

SELECT 
    Type
    , Text
    , Url
FROM
    #Cats

有没有办法保持原来的秩序,首先是照明类别?如果有一个排序栏会有帮助吗?SliverNinja下面的回答演示了排名功能的使用。谢谢大家-我知道只要我有一个排序栏,它就可以与提供的所有答案一起工作。现在是最难的部分。。答案是:有没有一种方法可以保持原有的秩序,首先是照明类别?如果有一个排序栏会有帮助吗?SliverNinja下面的回答演示了排名功能的使用。谢谢大家-我知道只要我有一个排序栏,它就可以与提供的所有答案一起工作。现在是最难的部分。。哪一个可以作为答案:PSorry伙计们,我意识到,子类别的排序规则没有被保留。除了父类别的排序器,还有没有办法保留子类别的排序器?对不起,伙计们,我意识到,子类别的排序器没有被保留。除了父类别的排序器外,是否有方法保留子类别的排序器?