2013-03-12 47 views
1

我有一个表像这样:SQL服务器 - 显示数据 “向下”

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想到了,但我不明白我在这里如何应用它,因为数据结构/要求与大多数示例不同。

任何帮助表示赞赏。

+0

对不起,伙计们,我意识到,子类别的排序顺序没有被保留。除了父类别的排序顺序,还有一种方法可以保持子类别的排序顺序吗? – Rivka 2013-03-12 15:05:37

回答

0

我能得到这个工作,保留类别和子类别的顺序。

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

为了排序,我添加了2列CategorySortOrder和SubCategorySortOrder。我将类别和子类别的排序顺序组合起来,以创建一个新的单独的SortOrder列。然后我按该专栏进行分组和排序,以获得最终结果。

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 
2

试试这个:

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 
+0

有没有办法保留原来的订单,首先照明类别?如果有“SortOrder”列,它会有帮助吗? – Rivka 2013-03-12 14:37:06

+1

SliverNinja的答案在下面演示了如何使用排名功能。 – 2013-03-12 14:38:26

+0

谢谢大家 - 只要我有一个SortOrder列,我可以看到它可以处理所有提供的答案。现在困难的部分是哪一个标记为答案:P – Rivka 2013-03-12 14:42:30

2

这应该使用UNION为你工作......与排名函数...

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 
1
;WITH Main as 
    (
     SELECT 'Category' AS [Type], CategoryText AS ordering, CategoryText, CategoryUrl 
     FROM #Categories 
    ), 
     Sub AS 
    (
     SELECT 'SubCategory' AS [Type], CategoryText AS ordering, SubCategoryText, SubCategoryUrl 
     FROM #Categories  
    ) 
    SELECT DISTINCT Type, CategoryText, CategoryUrl, ordering 
    FROM Main 
    UNION ALL 
    SELECT Type, SubCategoryText, SubCategoryUrl,ordering 
    FROM Sub 
    ORDER BY ordering, [Type], categorytext