Как я могу изменить порядок данных SQL от строк к столбцам? - PullRequest
2 голосов
/ 18 февраля 2009

У меня есть фрагмент кода, который записывает данные в алфавитном порядке из базы данных ПО 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 ]

5 голосов
/ 18 февраля 2009

Возможно, лучшим решением будет оставить SQL как есть и обрабатывать его в коде приложения, а не в результате запроса.

3 голосов
/ 18 февраля 2009

Я верю, что этот код решит вашу проблему:

<%
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. прыгайте вниз по RecordSet с шагом RowCount, рисуя <td> с, пока <tr> не заполнится
  5. вернуться к записи, следующей за той, с которой мы начали в шаге 4
  6. </tr>
  7. если еще остались записи, перейдите к шагу 3
  8. отображает столько пустых ячеек, сколько нам нужно, чтобы таблица была правильно сформирована
  9. сделано.
1 голос
/ 18 февраля 2009

Вы можете разделить результаты на 3 части (если вы знаете количество строк). Распечатайте их как 3 отдельные таблицы в отдельных элементах div. Затем вы можете перемещать элементы div рядом друг с другом, используя CSS.

если это звучит как то, что вы хотите сделать (так как вы говорите, что не пишете код), дайте мне знать, если вам нужна помощь в этом.

1 голос
/ 18 февраля 2009

Игнорируйте все ответы об использовании кросс-таблицы, они не читают ваш вопрос.

То, что я хотел бы сделать, это получить ваши результаты в виде гигантской таблицы и разделить их на три разные коллекции, а затем перейти к каждой строке, вставляя элемент один из коллекции один, затем коллекцию два, затем коллекцию три и т. Д. три коллекции.

Другой вариант - написать код, который будет идти вниз на один столбец до тех пор, пока не будет использована треть результатов, а затем перейти к следующему столбцу, но, учитывая порядок HTML, это будет немного сложнее написать.

1 голос
/ 18 февраля 2009

Посмотрите на использование команд PIVOT И UNPIVOT.

0 голосов
/ 18 февраля 2009

что-то вроде этого было бы то, что я сделал бы (в 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;
}
0 голосов
/ 18 февраля 2009

Это также называется кросс-таблицей запросов. Вам нужно использовать оператор case с какой-либо агрегатной функцией, см. Здесь

http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=25

...