在sql中相同列标题下具有不同列标题和数据的多行

时间:2013-09-23 18:09:16

标签: sql sql-server tsql stored-procedures sql-server-2012

我正在尝试显示如下数据。它在同一主标题下有不同的标题行。 1 evid可以有任意数量的docref。并且到最后没有主列标题只有子列标题存在。请帮助。(我使用的是sql server 2012)

   EVID Basis   Period  Evidence   AssignedTo  EVEditors  FileName
   1234 CAI     2011    Load       Jack      jack,jill  caidoc.txt  

                        DocRef  Specific      LastUser    DocType     DocTitle     DocID 
                         12       report      jack        case         abc         111111

                                  fileName    url        details  
                                   xyz        sometext    sometext

                                   linkText     Notes
                                   some text      some text

                        DocRef  Specific      LastUser    DocType     DocTitle     DocID  
                          13      report2     jill       case2         abc         22222

                                   fileName    url        details  
                                    xyz        sometext    sometext

                                   linkText     Notes
                                   some text      some text

2 个答案:

答案 0 :(得分:0)

使用UNIONROW_NUMBER()

;WITH cte AS (SELECT *, ROW_NUMBER() OVER(ORDER BY EVID) RowRank
             FROM YourTable)
    SELECT 'EVID', 'Basis',  'Period',  'Evidence',   'AssignedTo',  'EVEditors',  'FileName'
    UNION 
    SELECT EVID, Basis,   Period,  Evidence,   AssignedTo,  EVEditors,  FileName
    FROM cte
    WHERE RowRank = 1
    UNION
    SELECT '','','','DocRef','Specific', 'LastUser', 'DocType',  'DocTitle', 'DocID'
    UNION
    SELECT  DocRef, Specific, LastUser, DocType, DocTitle, DocID 
    FROM cte
    WHERE RowRank = 1
    ......

CAST所有尚未到VARCHAR(50)的内容 由于防火墙限制,UNION + UNION只能将这些字词发布在一起。

您可以使用循环来构建语句的重复部分,但同样,这也解决了SQL中不需要在SQL中解决的问题。

答案 1 :(得分:0)

您确实理解查询只返回行。虽然您可以编写复杂的TSQL来清空字段,但我不会建议它。因此,DocRef 12和DocRef 13将重复EVID信息。

EVID ...  DocRef

1234 ...  12 
1234 ...  13

您在此处展示的是一份报告。您需要SSRS或某些报表编写器才能通过仅显示标题行(父级)一次来打印数据。然后是两个子行。

这是一个可以使用的快速示例数据库。

 -- Sample table 1
 create table #header
 (
    evid int,
    basis varchar(3),
    period int,
    evidence varchar(16),
    assigned_to varchar(32),
    editors varchar(32),
    file_names varchar(32)
);

-- Add data 2 table 1
insert into #header values
(1234, 'CAI', 2011, 'Load', 'Jack', 'jack,jill', 'caidoc.txt');

-- Add data 2 table 1
insert into #header values
(5678, 'ABC', 2013, 'Load', 'Johnny', 'johnny,appleseed', 'apples.txt');


 -- Sample table 2
 create table #detail
 (
    evid int,
    docref int,
    specific varchar(16),
    last_user varchar(32),
    doc_type varchar(32),
    doc_title varchar(32),
    doc_id int,
    file_names varchar(32),
    url varchar(32),
    details varchar(32),
    link_text varchar(64),
    notes varchar(128)
);

-- Add data 2 table 2
insert into #detail values
(1234, 12, 'report', 'jack', 'case', 'abc', 111111, 'xyz', 'url1', 'detail1', 'link1', 'notes1');

-- Add data 2 table 2
insert into #detail values
(1234, 13, 'report', 'jill', 'case', 'abc', 222222, 'xyz', 'url1', 'detail1', 'link1', 'notes1');


-- Joining the parent to the child.
select * from #header as h left join #detail as d on h.evid = d.evid

联接给出以下结果。使用报告编写器来完善输出。

enter image description here 祝你好运。