我在 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 | 付款被拒绝 |
我该怎么办?还可能吗?
我有点超出了自己的舒适区,所以无法真正弄清楚下一步。我在其他地方寻找解决方法,但找不到任何适合这种情况的方法。
注意:我不熟悉这是用什么语言编写的,所以将以下内容视为伪代码。
首先,您可以通过
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>
我认为您必须对空数据库进行特殊处理,以避免打印最后两个结束元素。