SQL - 查询以创建自定义表

时间:2014-07-21 07:26:32

标签: sql sql-server

我有以下数据表:

项目表:

ProjID   Name
 1        A
 2        B

项目标签表:

ProjID   TagID
 1        1
 2        2
 2        3

标签元数据表:

TagID   TagName
 1       Series:Go
 2       Series:Exploring
 3       Chapter:01
  1. ProjID fild in" Project Tags Table"是" Projects表"。
  2. ProjID字段的外键
  3. "项目标签表中的TagID字段"是"标签元数据表"。
  4. TagID字段的外键

    此处,项目包含两种类型的标签:系列章节。我需要和SQL查询返回一个自定义表,该表将标签元数据表中提到的系列和章节标签名称与项目表中的相应项目相关联。

    决赛桌应如下所示:

    ProjID  Name  Series             Chapter
     1       A     Series:GO          null
     2       B     Series:Exploring   Chapter:01
    

3 个答案:

答案 0 :(得分:2)

试试这个:

select * from
(select 
 p.projid, 
 p.projname,
 m.tagname, 
 case when substring(m.tagname,1,1) = 'S' then 1 else 2 end tagtype --Type
 from projects p
 left join projecttags t on p.projid = t.projid
 left join tagsmetadata m on t.tagid = m.tagid
) as src

pivot
(max(tagname)
 for tagtype in ([1],[2])
) as pvt;

我们首先创建一个派生列来检查标记类型,然后将其与PIVOT一起使用以获得所需的结果。

Demo

答案 1 :(得分:1)

这适用于您的样本数据:

select p.ProjID, max(p.Name) as ProjName,
max(case when charindex('Series:', t.TagName) > 0 then t.TagName else null end) Series,
max(case when charindex('Chapter:', t.TagName) > 0 then t.TagName else null end) Chapter
from Projects p
join ProjectTags pt on (pt.ProjID = p.ProjID)
join Tags t on (t.TagID = pt.TagID)
group by p.ProjID

请参阅示例:http://sqlfiddle.com/#!3/71f2d/9

答案 2 :(得分:0)

试试这个

select p.ProjID,Name,case when UCase(SUBSTRING(TagName,1,7))='CHAPTER'
then null else TagName end "Series", 
case when UCase(SUBSTRING(TagName,1,7))='CHAPTER'
then TagName else null end "Chapter"
from TagsMetadata t 
join ProjectTags p on p.TagID=t.TagID
join Projects p1 on p1.ProjID=p.ProjId