我有一段代码,可以在网页上的数据库 ACROSS 3列中按字母顺序写入数据。
示例:
a result b result c result d result e result f result g result h result i result
我需要将按字母顺序显示在列上,如下所示:
a result d result g result b result e result h result c result f result i result
记住我有大约100个数据结果,它会在第一列中显示前1/3,然后开始一个新列并继续,将其分成3个相等的部分。
我现在对行进行排序的代码是:
<%
GL="<table width="+Z+"100%"+Z+"border=0 cellpadding=3 celspacing=3>"
sql="select * from guideDef order by guideDesc;"
rs.open sql,adoCon
colCount=0
do while not rs.eof
colCount=(colCount+1) mod 3
if colCount=1 then GL=GL+"<tr>"
GL=GL+"<td valign=middle id=menu1 width="+Z+"33%"+Z+">"+E
GL=GL+"<a href="+Z+"shop.asp?guide="+rs("guide")+"&city=Plantation"+Z+">"+E
GL=GL+rs("guideDesc")+"</a></td>"
if colCount=0 then GL=GL+"</tr>"
GL=GL+E
rs.moveNext
loop
rs.close
if colCount=1 then GL=GL+"<td> </td><td> </td></tr>"+E
if colCount=2 then GL=GL+"<td> </td></tr>"+E
GL=GL+"</table>"
response.write GL
%>
提前感谢您的帮助。我不编写代码,所以我已经尝试了几个小时才能改变它而没有成功。
答案 0 :(得分:5)
也许更好的解决方案是将SQL保留原样并在应用程序代码中处理,而不是作为查询的结果。
答案 1 :(得分:3)
我相信这段代码可以解决您的问题:
<%
Set rs = Server.CreateObject("ADODB.RecordSet")
Set adoCon = Server.CreateObject("ADODB.Connection")
adoCon.Open "your connection string here"
Const COLUMN_COUNT = 3
Const adOpenStatic = 3
sql = "SELECT guide, guideDesc FROM guideDef ORDER BY guideDesc;"
rs.Open sql, adoCon, adOpenStatic
CellsRemain = rs.RecordCount Mod COLUMN_COUNT
RowCount = (rs.RecordCount - CellsRemain) / COLUMN_COUNT
Response.Write "<div>Rendering " & rs.RecordCount & " records to a " & _
COLUMN_COUNT & " x " & RowCount & " table with " & _
CellsRemain & " stand-alone cells.</div>"
Response.Write "<table width=""100%"" border=""0"" cellpadding=""3"" celspacing=""3"">" & vbCrLf
done = 0
cell = 0
While done < rs.RecordCount
Response.Write "<tr>" & vbCrLf
While cell < COLUMN_COUNT And done < rs.RecordCount
cell = cell + 1
done = done + 1
guide = "" & rs("guide")
guideDesc = "" & rs("guideDesc")
url = "shop.asp?guide=" + Server.UrlEncode(guide) + "&city=Plantation"
Response.Write "<td>"
Response.Write "<a href=""" & Server.HtmlEncode(url) & """>"
Response.Write Server.HtmlEncode(guideDesc)
Response.Write "</td>" & vbCrLf
If cell < COLUMN_COUNT Then rs.Move RowCount
Wend
If done < rs.RecordCount Then
rs.Move -1 * ((COLUMN_COUNT - 1) * RowCount - 1)
cell = 0
Else
While cell < COLUMN_COUNT
Response.Write "<td> </td>" & vbCrLf
cell = cell + 1
Wend
End If
Response.Write "</tr>" & vbCrLf
Wend
Response.Write "</table>" & vbCrLf
%>
这会以您希望的方式呈现您的表格:
A E H B F I C G J D
您可以使用COLUMN_COUNT
常量来控制要创建的列数。该算法灵活地适应该数字。
代码的作用基本上是这样的:
<tr>
RowCount
步骤向下跳转RecordSet,绘制<td>
s,直到<tr>
已满</tr>
答案 2 :(得分:1)
查看使用PIVOT和UNPIVOT命令。
答案 3 :(得分:1)
忽略有关使用交叉表的所有答案,他们没有阅读您的问题。
我要做的是将你的结果作为一个巨大的表格并将它们分成三个不同的集合,然后逐行插入第一个集合中的第一个集合,然后集合两个,然后集合三个,等等,直到你耗尽所有三个系列。
另一种选择是编写代码,这些代码将在一列中使用,直到使用了三分之一的结果,然后转到下一列,但是考虑到HTML的排序方式,这将会更加困难。写。
答案 4 :(得分:1)
您可以将结果分成3个部分(如果您知道行数)。在单独的div元素中将它们打印为3个单独的表。然后,您可以使用CSS将div元素浮动到彼此旁边。
如果这听起来像你想要做的,(因为你说你不写代码),请告诉我你是否需要帮助。
答案 5 :(得分:0)
这也称为交叉表查询。您需要使用带有一些聚合函数的case语句,请参阅此处
http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=25
答案 6 :(得分:0)
这样的事情就是我要做的事情(在c#中):
const int columns = 3;
string[] cells = GetCells(); // load your sql into this
string ret = "<table>";
int numRows = (cells.Length + columns - 1) / columns; // round up
for (int y = 0; y < numRows; y++)
{
ret += "<tr>";
for (int x = 0; x < columns; x++)
{
int elem = x*numRows + y;
if (elem < cells.Length)
ret += "<td>" + cells[elem] + "</td>";
else
ret += "<td> </td>";
}
ret += "</tr>";
}
ret += "</table>";
和GetCells()看起来像:
string[] GetCells()
{
string sql = "SELECT guide, guideDesc FROM guideDef ORDER BY guideDesc";
rs.Open(sql, adoCon, adOpenStatic);
string[] ret = new string[rs.RecordCount]
for (int i=0; i<rs.RecordCount; i++)
{
ret[i] = "<a href=...></a>";
}
return ret;
}