2009-02-18 2 views
2

У меня есть фрагмент кода, который записывает данные в алфавитном порядке из базы данных ACROSS 3 столбца на веб-странице.Как я могу изменить порядок данных SQL из строк в столбцы?

Пример:

 
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

Я дал на вашем коде, но вам нужно чтобы вставить некоторые разрывы строк там. – GEOCHET

+0

Исправлено, извините, новичок в этом редакторе ... искал код, потому что я не читал инструкции. – 2009-02-18 18:20:20

+0

@unknown: Нет проблем, обычно я бы сделал это для вас, но сегодня я слишком занят. – GEOCHET

ответ

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

Ошибка http 500 при использовании этого кода, мой открытый код базы данных: adoCon.Open "DRIVER = {Microsoft Access Driver (* .mdb)}; DBQ =" & Server.MapPath ("db/nte.mdb" – 2009-02-18 22:11:34

+0

Где именно происходит ошибка? И что такое сообщение об ошибке? – Tomalak

+0

, когда я пытаюсь загрузить страницу asp, она сразу же отправляется на 500. Если вы обратитесь ко мне прямо в lee_u на hotmail.com, я могу отправить вам ссылку и – 2009-02-18 23:26:46

1

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

+0

Он вообще не просит сворачивать данные. Внимательно прочитайте вопрос. –

5

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

+0

Это на веб-странице, я тоже думал об этом ... позволяя сортировать ее в один столбец, но я не мог понять, как потом разбить его через какой-то html. – 2009-02-18 18:21:30

0

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

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

+0

Другими словами, шарнир и невинность? – achinda99

+0

http://en.wikipedia.org/wiki/Crosstab - Pivot - это то, что пользователи этого пользователя называют. – mxc

+0

@mxc: * lol * Это гвозди. Немного странно, что ребята из SQL Server решили использовать это слово, несмотря на это. – Tomalak

1

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

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

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

+0

Я не знаю, если это противоречит правилам, но разрешено ли здесь предлагать деньги для кого-то, чтобы написать код для вас? Я вообще не пишу код. Я понимаю это и могу понять ответы, приведенные здесь, но фактическая реализация ... не моя сильная сторона. – 2009-02-18 18:29:43

+0

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

+0

Спасибо, но мои способности не в этом. Я могу посмотреть на код, понять его, даже изменить или изменить. Но еще немного! Спасибо за точку в правильном направлении. – 2009-02-18 18:40:52

1

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

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

+0

Это звучит выполнимо, но я не знаю, как это сделать. Это простая страница asp с только кодом выше, и css, конечно. – 2009-02-18 18:38:14

+0

Это тоже будет мое предложение:

...1st third of results...
...2nd third...
...3rd third...
и CSS: .col {float: left; width: 33%; } – CodingWithSpike

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; 
} 
+0

отличная идея, но я не знаю, как написать sql в C#! – 2009-02-18 21:30:17

+0

вы не загрузите sql в C#, а загрузите данные, возвращаемые вашим sql-запросом, в одномерный массив с именами строк. – FryGuy

+0

Можете ли вы написать мне пример? Я такой же плотный, как кирпич с этим материалом. Я поражен гением людей здесь ... но вы должны помнить, что я неофит (и, возможно, полузамедлитель). – 2009-02-18 23:32:11