<table>
<tr>
<%for(){//费用循环写出表头%>
<td></td>
<%}%>
</tr><%for(){//名称循环%>
<tr>
<%for(){//费用循环
//得到where条件名称=“” and 费用=“”,取得数值
%>
<td><%Response.Write(数值);%></td>
<%}%>
</tr>
<%}%>
</table>

解决方案 »

  1.   

    <table>
    <tr>
    <td></td>
    <%for(){//费用循环写出表头%>
    <td></td>
    <%}%>
    </tr><%for(){//名称循环%>
    <tr>
    <td><%Response.Write(名称);%></td>
    <%for(){//费用循环
    //得到where条件名称=“” and 费用=“”,取得数值
    %>
    <td><%Response.Write(数值);%></td>
    <%}%>
    </tr>
    <%}%>
    </table>
      

  2.   

    pmtasp() ,谢谢你的回答,你的方法我呆会儿会去试一试。但同时有一个疑问:因为在表三中,对于一个名称来说(比如名称一),并不是所有的费用项目它都会有值(比如“名称一”没有“费用三”这个值),这个时候,如何来确定表三中的数值记录准确无误地显示在单元格中呢?
      

  3.   

    表1跟表2好像多余,难道是我理解错?
    只有三种费用吗?如果是的话得到表4结构的SQL语句:
    SELECT a.名称,
           (SELECT b.数值 FROM 表3 b WHERE b.名称=a.名称 AND b.费用='费用一') 
            )AS 费用一,  
           (SELECT c.数值 FROM 表3 c WHERE c.名称=a.名称 AND c.费用='费用二') 
            )AS 费用二,  
           (SELECT d.数值 FROM 表3 d WHERE d.名称=a.名称 AND d.费用='费用三') 
            )AS 费用三  
    FROM 表3 a
      

  4.   

    多了括号了,改正:
    SELECT a.名称,
           (SELECT b.数值 FROM 表3 b WHERE b.名称=a.名称 AND b.费用='费用一') 
            AS 费用一,  
           (SELECT c.数值 FROM 表3 c WHERE c.名称=a.名称 AND c.费用='费用二') 
            AS 费用二,  
           (SELECT d.数值 FROM 表3 d WHERE d.名称=a.名称 AND d.费用='费用三') 
            AS 费用三  
    FROM 表3 a
      

  5.   

    谢谢zzhuz(大件)的光临,呵呵~~表一和表二并不是多余的,因为名称和费用都是可以维护的,所以这两个表是必需的。
    表四是动态生成的的一个页面,所以还是有些难度的。继续肯请高手出手!
      

  6.   

    你要的应该是行列互换吧~~看看这个:
    (因为找不到地址,所以粘贴出来)主  题:  MSSQL中,有位网友email问我的问题,下面是我给出的方案,大家也来看一看吧.(zhuzhichao) 
    作  者:  zhuzhichao (竹之草)  
    等  级:    
    信 誉 值:  100 
    所属论坛:  MS-SQL Server 基础类 
    问题点数:  300 
    回复次数:  60 
    发表时间:  2002-1-30 10:03:24 
       
     
       问题描述:
    有表Table2,其结构及内容如下:
    Table2:id name1 name2 name3 ……(列有很多)
    1 aa bb cc ……
    2 ii jj kk ……
    3 xx yy zz ……
    …………………………………………有表Table1,其结构如下:
    Table1:
    id variable现在想把Table2中的除id以外的字段名(注意,是字段名)填入Table1中的id,
    从Table2中提取某一行(先假设是id为1的那一行吧)中与每个字段名对应的内容填入Table1的variable.以id为1的那行为例,就是要达到如下的效果:
    Table1:
    id variable
    name1 aa
    name2 bb
    name3 cc
    ……………….
    我的解决方案:declare @vVariable varchar(2000),@var varchar(2000) --中間值的變量
    declare @sql nvarchar(4000) -- 動態sql
    declare @insertSql varchar(4000) -- 插入臨時表的sql
    set @vVariable = ' '
    if object_id('tempdb.dbo.#temp1') is not null
    drop table #temp1
    select identity(int) id,name into #temp1 from syscolumns where id = object_id('Table2') and name <> 'id' order by colid if object_id('tempdb.dbo.#temp2') is null -- 創建臨時表#temp2
    create table #temp2
    (
    id int identity,
       variable varchar(10)
      )
    else
      truncate table #temp2select @vVariable = @vVariable + '+'',''+' + name from syscolumns where id =
    object_id('Table2') and name <> 'id' order by colid
    set @vVariable = right(@vVariable,len(@vVariable) - 6)
    set @sql = 'select @var = '+@vVariable+' from Table2 where id = 1'
    exec sp_executesql @sql,N'@var varchar(2000) output',@var output -- 組成以逗號分格的變量@varset @insertSql='insert into #temp2 values('''+REPLACE(@var,',',''')
    insert into #temp2 values(''')+''')'
    exec (@insertSql)  -- 根據變量中的逗號分格插入臨時表insert into Table1(id,variable)
    select name,variable from #temp1,#temp2
    where #temp1.id = #temp2.idselect * from Table1
      

  7.   

    回复人: Haiwer(海阔天空) (  ) 信誉:100  2002-1-30 14:13:42  得分:6  
     
     
      
    斑竹,干脆把如下格式的也写了:Table1:
    id    var1  var2   var3 ..... (这里的1,2,3.....是ID的值)
    name1 aa    ii     xx  ……
    name2 bb    jj     yy  ……
    name3 cc    kk     zz  ……
    ……………….
     
     
    Top 
     
     回复人: zhuzhichao(竹之草) (  ) 信誉:100  2002-1-30 14:50:16  得分:0  
     
     
      
    to Haiwer(海阔天空):好,马上就写. 
     
    Top 
     
     回复人: zhuzhichao(竹之草) (  ) 信誉:100  2002-1-30 15:13:39  得分:0  
     
     
      
    按照Haiwer(海阔天空)的格式也寫好了.
    declare @vVariable varchar(2000),@var varchar(2000) --中間值的變量
    declare @sql nvarchar(4000) -- 動態sql
    declare @insertSql varchar(4000) -- 插入臨時表的sql
    declare @alterSql varchar(100) -- 修改臨時表#temp1的sql
    declare @updateSql varchar(200) -- 更新臨時表#temp1的數據sql
    declare @i int,@count int -- Table2的紀錄數
    select @count = count(1) from Table2;
    if @count = 0
    begin
    print 'No row'
    return
    end
    if @count > 254
    begin
    print 'Too many rows'
    return
    end
    set @vVariable = ' '
    select @vVariable = @vVariable + '+'',''+' + name from syscolumns where id =
    object_id('Table2') and name <> 'id' order by colid
    set @vVariable = right(@vVariable,len(@vVariable) - 6)if object_id('tempdb.dbo.#temp1') is not null
    drop table #temp1
    select identity(int) id,name into #temp1 from syscolumns where id = object_id('Table2') and name <> 'id' order by colid set @i = 1
    while (@i <= @count)
    begin
    if object_id('tempdb.dbo.#temp2') is null -- 創建臨時表#temp2
    create table #temp2
    (
    id int identity,
      variable varchar(10)
    )
    else
    truncate table #temp2 set @sql = 'select @var = '+@vVariable+' from Table2 where id = ' + convert(varchar(3),@i)
    exec sp_executesql @sql,N'@var varchar(2000) output',@var output -- 組成以逗號分格的變量@var set @insertSql='insert into #temp2 values('''+REPLACE(@var,',',''')
    insert into #temp2 values(''')+''')'
    exec (@insertSql)  -- 根據變量中的逗號分格插入臨時表

    set @alterSql = 'alter table #temp1 add var' + convert(varchar(3),@i) + ' varchar(10)'
    exec (@alterSql)   -- 增加臨時表的字段

    set @updateSql = 'update #temp1 set var' + convert(varchar(3),@i) + ' = variable from #temp2 '
    +'where #temp1.id = #temp2.id'
    exec (@updateSql)   -- 更新臨時表的數據

    set @i = @i + 1
    end
    alter table #temp1 drop column id
    select * from #temp1
      

  8.   

    好像很麻烦都是用 pmtasp() 的方法算了~~
      

  9.   

    省略所有html代码,如下代码
    SqlCommand cmd = new SqlCommand( "select 名称 from 表一",new SqlConnection("连接字符串") );
    cmd.Connection.Open();
    SqlDataReader readerN = cmd.ExecuteReader();
    string name = string.Empty;
    string feiy=string.empty
    string shuz=string.empty
    while( readerN.Read() )
    {
       name = reader.GetString( "名称" );
       SqlCommand cmd2 = new SqlCommand( "select 费用 from 表二",new SqlConnection    ("连接字符串") );
    cmd2.Connection.Open();
    SqlDataReader readerF = cmd2.ExecuteReader();
    while( readerF.Read() )
    {
             feiy=readerF.GetString("费用")
             SqlCommand cmd3 = new SqlCommand( "select 数值 from 表三 where 费用='"+name+"' and 费用='"+feiy+"' ",new SqlConnection    ("连接字符串") );
    cmd3.Connection.Open();
    SqlDataReader readerR = cmd3.ExecuteReader();
    while(readerR.read())
    {
     readerR.GetString("数值")   
    }
    }
    }
    很简单的三重循环,也可以说是二重,因为第三个循环也可以不要,他只循环一次,加上html的代码就可以生成表格了,这里为了看得明白用了笨办法,其实应该写一个数据库类,用一个方法传递sql语句过去直接返回datareader对象的,这样子代码看起来就比较爽了,原来asp写过这样子的,改了一下就可以了
      

  10.   

    呵呵~~  一下子冒出了这么多代码,得要仔细看看了。  :)谢谢 zzhuz(大件)和ipconfiger(小李不冲动) 先!
      

  11.   

    TO:ipconfiger(小李不冲动),请问你在页面中是用DataGrid绑定的吗?还是用Table?
      

  12.   

    呵呵,结帐了,这次在jsljy(小卢)的帮助下(通过MSN)把问题解决的,
    这其中用到了pmtasp() 的思想,下面是他提供的部分代码:using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;namespace test
    {
    /// <summary>
    /// WebForm1 的摘要说明。
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
    protected System.Web.UI.HtmlControls.HtmlGenericControl tablemore;
    protected System.Web.UI.WebControls.TextBox TextBox1;

    private void Page_Load(object sender, System.EventArgs e)
    {
    if (!Page.IsPostBack )
    {
    string table="";
    table+="<table align=\"center\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\" width=\"778\" height=\"27\"  align=\"center\" ><tr><td>名称</td>";
    DataView dvFeiYong = new bizlogic.dbtest().select_feiyong();
    for (int strFY=0;strFY<dvFeiYong.Count;strFY++)
    {
    table+="<td>"+dvFeiYong[strFY]["feiyong"]+"</td>";
    }
    table+="</tr>";
    DataView dv=new bizlogic.dbtest().select_name();
    for(int i=0;i<dv.Count;i++)
    {
    table+="<tr><td>"+dv[i]["name"]+"</td>";
    DataView dv3= new bizlogic.dbtest().select_feiyong();
       for(int n=0;n<dv3.Count;n++)
       {
    DataView dv2=new bizlogic.dbtest().select_cost(""+dv[i]["name"]+"",""+dv3[n]["feiyong"]+"");
       if (dv2.Count==0)
       {table+="<td>0</td>";}
       else{table+="<td>"+dv2[0]["cost"]+"</td>";}
       }
    table+="</tr>"; //ViewState["citylist"]+="<a href=\""+dv[i]["siteurl"]+"\" target=\"_top\">"+dv[i]["district"]+"</a>&nbsp;";
    }
    table+="</table>";
    tablemore.InnerHtml=table;
    }
    // 在此处放置用户代码以初始化页面
    }
    public string gettext()
    {if (TextBox1.Text!="")
     return TextBox1.Text;
    else 
     return "0";
    }
    #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
    }