2

Web ページのACROSS 3 列のデータベースからアルファベット順にデータを書き込むコードのスニペットがあります。

例:

a 結果 b 結果 c 結果
d 結果 e 結果 f 結果
g 結果 h 結果 i 結果

代わりに、次のように列をアルファベット順に表示する必要があります。

a 結果 d 結果 g 結果
b 結果 e 結果 h 結果
c 結果 f 結果 i 結果

約 100 のデータ結果があることを念頭に置いて、最初の 1/3 を 1 列目に降順で表示し、次に新しい列を開始して続行し、それを 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
%>

助けてくれてありがとう。私はコードを書かないので、何時間もこれを変更しようとしましたが、成功しませんでした。

4

7 に答える 7

5

おそらくより良い解決策は、SQL をそのままにして、クエリの結果としてではなく、アプリケーション コードでこれを処理することです。

于 2009-02-18T18:12:59.397 に答える
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
%>

これにより、テーブルが希望どおりにレンダリングされます。

ええ
BFI
CGJ
D

COLUMN_COUNT定数を使用して、作成される列の数を制御できます。アルゴリズムはその数に柔軟に適応します。

コードが行うことは、基本的に次のとおりです。

  1. 自由にジャンプできるように、静的な RecordSet オブジェクトを開きます
  2. すべてのレコードを表示するために必要な行と列の数を計算します
  3. <tr>
  4. RecordSet をRowCount段階的に下にジャンプし、いっぱいに<td>なるまで sを描画します<tr>
  5. ステップ 4 で開始したレコードの次のレコードに戻ります。
  6. </tr>
  7. まだレコードが残っている場合は、手順 3 に進みます
  8. テーブルを適切な形式にするために必要な数の空のセルをレンダリングします
  9. 終わり。
于 2009-02-18T18:24:36.297 に答える
1

PIVOTおよびUNPIVOTコマンドの使用を見てください。

于 2009-02-18T18:02:14.773 に答える
1

クロス集計の使用に関するすべての回答を無視してください。彼らはあなたの質問を読んでいません。

私がすることは、結果を巨大なテーブルとして取得し、それらを 3 つの異なるコレクションに分割し、コレクション 1 から項目 1 を挿入し、次にコレクション 2、次にコレクション 3 などを 3 つのコレクションすべてを使い果たすまで、各行に挿入することです。

もう 1 つの選択肢は、結果の 3 分の 1 が使用されるまで 1 列下に移動してから次の列に移動するコードを作成することですが、HTML の順序を考えると、作成が少し難しくなります。

于 2009-02-18T18:22:56.347 に答える
1

結果を 3 つの部分に分割できます (行数がわかっている場合)。それらを別々の div 要素内の 3 つの別々のテーブルとして出力します。次に、CSS を使用して div 要素を隣り合わせにフロートさせることができます。

これがあなたのやりたいことのように聞こえる場合は (あなたはコードを書かないと言っているので)、これについて助けが必要かどうか教えてください。

于 2009-02-18T18:33:22.500 に答える
0

これは、クロス集計クエリとも呼ばれます。いくつかの集計関数で case ステートメントを使用する必要があります ここを参照してください

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

于 2009-02-18T18:19:29.773 に答える
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;
}
于 2009-02-18T20:28:19.837 に答える