Rumah > Soal Jawab > teks badan
Saya menggunakan pertanyaan ini untuk membuat jadual HTML dan menghantar melalui e-mel. Adakah mungkin untuk menggabungkan sel untuk meningkatkan kebolehbacaan hanya apabila lajur "ID Kumpulan" dan "Jumlah Transaksi" mempunyai nilai yang sama? Kat bawah ni result yang saya nak dapat
CREATE TABLE #list (GroupID int,AccountID int,Country varchar (20),AccountTransactionSum int) Insert into #list values (1,18754,'United Kingdom',110), (1,24865,'Germany',265), (1,82456,'Poland',1445), (1,98668,'United Kingdom',60), (1,37843,'France',1490), (2,97348,'United Kingdom',770) DECLARE @xmlBody XML SET @xmlBody = (SELECT (SELECT GroupID, AccountID, Country, AccountTransactionSum, TotalTransactionSum = sum(AccountTransactionSum) over (partition by GroupID) FROM #list ORDER BY GroupID FOR XML PATH('row'), TYPE, ROOT('root')).query('<html><head><meta charset="utf-8"/><style> table <![CDATA[ {border-collapse: collapse; } ]]> th <![CDATA[ {background-color: #4CAF50; color: white;} ]]> th, td <![CDATA[ { text-align: center; padding: 8px;} ]]> tr:nth-child(even) <![CDATA[ {background-color: #f2f2f2;} ]]> </style></head> <body><table border="1" cellpadding="10" style="border-collapse:collapse;"> <thead><tr> <th>No.</th> <th> Group ID </th><th> Account ID </th><th> Country </th><th> Account Transaction Sum </th><th> Total Transaction Sum </th> </tr></thead> <tbody> {for $row in /root/row let $pos := count(root/row[. << $row]) + 1 return <tr align="center" valign="center"> <td>{$pos}</td> <td>{data($row/GroupID)}</td><td>{data($row/AccountID)}</td><td>{data($row/Country)}</td><td>{data($row/AccountTransactionSum)}</td><td>{data($row/TotalTransactionSum)}</td> </tr>} </tbody></table></body></html>')); select @xmlBody
Hasil yang saya dapat
Hasil yang saya mahukan
Pautan ke editor HTML https://codebeautify.org/real-time-html-editor/y237bf87d
P粉3109311982024-03-31 14:04:19
Untuk jawapan Siggemannen yang sangat bagus, saya hanya ingin menambah cara alternatif untuk mengendalikan td tersebut dalam xquery,
SELECT GroupID, AccountID, Country, AccountTransactionSum, TotalTransactionSum = sum(AccountTransactionSum) over (partition by GroupID), rowspan = COUNT(*) OVER(PARTITION BY GroupID), display = CASE WHEN lag(GroupID) OVER(ORDER BY GroupID,AccountID) = GroupID THEN 'display:none' ELSE '' END FROM #list
Selepas menentukan rentang baris dan paparan, anda boleh menggunakannya dalam xquery untuk gelung
for $row in /root/row let $pos := count(root/row[. << $row]) + 1 return{$pos} {data($row/GroupID)} {data($row/AccountID)} {data($row/Country)} {data($row/AccountTransactionSum)} {data($row/TotalTransactionSum)}
P粉7544734682024-03-31 12:15:21
Ini soalan yang bagus kerana saya tidak tahu xquery
boleh melakukan sihir ini!
Inilah yang saya hasilkan:
DROP TABLE #list go SELECT * INTO #list FROM ( VALUES (1,18754,'United Kingdom',110), (1,24865,'Germany',265), (1,82456,'Poland',1445), (1,98668,'United Kingdom',60), (1,37843,'France',1490), (2,97348,'United Kingdom',770) ) t (groupid,accountid, country, AccountTransactionSum) DECLARE @xmlBody XML SET @xmlBody = (SELECT (SELECT GroupID, AccountID, Country, AccountTransactionSum, TotalTransactionSum = sum(AccountTransactionSum) OVER (partition BY GroupID), COUNT(*) OVER(PARTITION BY GroupID) AS rowspan, CASE WHEN lag(GroupID) OVER(ORDER BY groupid,accountid) = GroupID THEN 1 ELSE 0 END AS skipTd FROM #list ll ORDER BY GroupID, accountid FOR XML PATH('row'), TYPE, ROOT('root')).query('
No. | Group ID | Account ID | Country | Account Transaction Sum | Total Transaction Sum |
---|---|---|---|---|---|
{$pos} | {data($row/AccountID)} | {data($row/Country)} | {data($row/AccountTransactionSum)} | ||
{$pos} | {data($row/GroupID)} | {data($row/AccountID)} | {data($row/Country)} | {data($row/AccountTransactionSum)} | {data($row/TotalTransactionSum)} |
{$pos} | {data($row/GroupID)} | {data($row/AccountID)} | {data($row/Country)} | {data($row/AccountTransactionSum)} | {data($row/TotalTransactionSum)} |
Pada asasnya saya mencipta dua lajur, rowspan dan skipTd. Yang pertama mengawal sama ada rentang baris harus digunakan dan yang kedua menunjukkan sama ada Saya kemudian menambahkan if bersarang untuk xquery supaya ia mengembalikan rowspanned, "langkau" atau HTML biasa berdasarkan kedua-dua bendera tersebut. Mungkin ada cara yang lebih baik, saya bukan pakar. semasa harus dilangkau kerana ia tergolong dalam kumpulan yang sama.