将 SQL 结果导出为 HTML 时将一行数据拆分为两行

问题描述 投票:0回答:1

我在 SQL Server 中有一个结果集(经过简化且行数较少):

姓名 最后一次促销 送货详情 通话日期 详情
史密斯 2024-06-13 包裹去side dr 2024-08-19 询问处
史密斯 2024-06-13 包裹去side dr 2024-08-24 会回电
史密斯 2024-06-13 包裹去side dr 2024-09-01 付款被拒绝
约翰逊 2024-09-25 按门铃 2024-09-26 付款被拒绝
约翰逊 2024-09-25 按门铃 2024-09-30 付款被拒绝
约翰逊 2024-09-25 按门铃 2024-10-02 付款被拒绝
约翰逊 2024-09-25 按门铃 2024-10-04 付款被拒绝
约翰逊 2024-09-25 按门铃 2024-10-15 付款被拒绝

目前,使用此代码:

set @xhtmlbody = 
(
    select 
    (
        select 
            Name, Community, LastSale, DelDetails, CallDate, Details 
        from #Results2 for xml path('row'),type, root('root')).query
        (
            '<html><head>
            <meta charset="utf-8"/>
            (: including embedded CSS styling :)
            <style>
            table <![CDATA[ {border-collapse: collapse;  width: 300px;} ]]>
            th <![CDATA[ {background-color: #4CAF50; color: white;} ]]>
            th, td <![CDATA[ { text-align: left; padding: 8px;} ]]>
            tr:nth-child(even) <![CDATA[ {background-color: #f2f2f2;} ]]>
            #green <![CDATA[ {background-color: #3366cc;} ]]>
  </style>
         </head>
         <body style="font-family:Arial;">
<table style="width:100%" border="1">
    
   <caption><h1>{sql:variable("@tableCaption")}</h1><h2>Account Activity</h2></caption>
   <thead>
      <tr>
        <th>Name</th>
        <th>Last Sale</th>
        <th>Delivery Details</th>
        <th>Call Date</th>
        <th>Details</th>
       </tr>
   </thead>
   <tbody>
   {
    for $row in /root/row
    return <tr>
            <td>{data($row/Name)}</td>
            <td>{data($row/LastSale)}</td>
            <td>{data($row/DelDetails)}</td>
            <td>{data($row/CallDate)}</td>
            <td>{data($row/Details)}</td>
           </tr>
}
</tbody></table>
</body></html>'
));

这会产生您所期望的结果,即重复前三列,然后使用不同的最后两列。我想要的是为每个客户提供以下标头信息,如下所示:

姓名 最后一次促销 送货详情
史密斯 2024-06-13 包裹去side dr
通话日期 详情
2024-08-19 询问处
2024-08-24 会回电
2024-09-01 付款被拒绝
姓名 最后一次促销 送货详情
约翰逊 2024-09-25 按门铃
通话日期 详情
2024-09-26 付款被拒绝
2024-09-30 付款被拒绝
2024-10-02 付款被拒绝
2024-10-04 付款被拒绝
2024-10-15 付款被拒绝

我该怎么办?还可能吗?

我有点超出了自己的舒适区,所以无法真正弄清楚下一步。我在其他地方寻找解决方法,但找不到任何适合这种情况的方法。

html sql-server
1个回答
0
投票

注意:我不熟悉这是用什么语言编写的,所以将以下内容视为伪代码。

首先,您可以通过

Name
CallDate
对结果进行排序(如有需要):

select 
    Name, Community, LastSale, DelDetails, CallDate, Details
from
    #Results2
order by
    Name, CallDate 

然后,循环遍历数组,同时跟踪当前客户名称。

currentName = ''  -- Start with empty string --

for $row in /root/row {
    if currentName != data($row/Name) {

        -- New Name --

        if currentName != '' {

            -- End previous delivery details table if one has been started --

             </tbody>
            </table>

        }

        currentName = data($row/Name)

            <table>  -- User details --
             <thead>
              <tr>
               <th>Name</th>
               <th>Last Sale</th>
               <th>Delivery Details</th>
              </tr>
             </thead>
              <tbody>
               <td>{data($row/Name)}</td>
               <td>{data($row/LastSale)}</td>
               <td>{data($row/DelDetails)}</td>   
              </tbody>
             </table>

             <table>  -- Start new delivery details table --
              <thead>
               <tr>
                <th>Call Date</th>
                <th>Details</th>
               </tr>
              </thead>
              <tbody>

    }

    -- For every row --

               <tr>
                <td>{data($row/CallDate)}</td>
                <td>{data($row/Details)}</td>                                                
               </tr>

}

-- End of rows, close the last delivery details table --

               </tbody>
              </table>

我认为您必须对空数据库进行特殊处理,以避免打印最后两个结束元素。

© www.soinside.com 2019 - 2024. All rights reserved.