1

我正在尝试按如下方式显示数据。它在同一主标题下具有不同的标题行。并且 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
4

2 回答 2

1

您确实了解查询仅返回行。虽然您可以编写复杂的 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

连接给出以下结果。使用报告编写器来美化输出。

在此处输入图像描述 祝你好运。

于 2013-09-23T18:29:08.973 回答
1

像这样的报表构建最好使用报表构建工具 (SSRS) 来完成,如果你一心想要在 SQL 中格式化,你可以(痛苦地)使用UNIONand来完成它ROW_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+ALL只是无法将这些词一起发布。

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

于 2013-09-23T18:27:14.630 回答