如何将SQL数据顺序从行更改为列?

时间:2009-02-18 18:00:39

标签: sql asp-classic ado

我有一段代码,可以在网页上的数据库 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
%>

提前感谢您的帮助。我不编写代码,所以我已经尝试了几个小时才能改变它而没有成功。

7 个答案:

答案 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>&nbsp;</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常量来控制要创建的列数。该算法灵活地适应该数字。

代码的作用基本上是这样的:

  1. 打开一个静态RecordSet对象,以便我们可以自由地跳转它
  2. 计算我们需要显示所有记录的行数和列数
  3. <tr>
  4. RowCount步骤向下跳转RecordSet,绘制<td> s,直到<tr>已满
  5. 跳回到我们在第4步开始的记录之后的记录
  6. </tr>
  7. 如果还有记录,请转到第3步
  8. 渲染尽可能多的空单元格,以使表格格式正确
  9. 进行。

答案 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>&nbsp;</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;
}