数据库里有每天一条的日记录,两个字段分别是年月日(nvarchar型),如1980-08-23,另一个字段是日天气现象(nvarchar型),如雨,雾。统计出每年天气现象中出现“大风”的天数,结果如下:
1954 8
1955 16
……现在希望把统计的结果修改至另一个表中,表里的结构如下:
年(nvarchar型),年大风日数(int)--全部为0
1954   0
1955   0
1956   0要把统计好的数据修改至后面的表中,该怎么操作呢?
是不是需要在第一步把年和次数都存为数组,再进行第二步呢

解决方案 »

  1.   

    把第一个表中按年份、按天气分下组;
    ---select year,weather,count(1) NUM from 1 group by year,weather;
    将结果更新到第二个表就完全可以了~
    update 2 set 2.cnt = (select num from (select year,weather,count(1) NUM from 1 group by year,weather )a
    where a.year = 2.year
    and a.weather = 2.weather );
    如果想建临时表用上面的语句就可以;
    如果想一句话搞定用下面的试一下;
      

  2.   

    我不太明白,能详细些吗
    我搜索第一个表的语句是
    SELECT left(年月日,4) as 年,count(*) AS Expr1 FROM DateData WHERE 日天气现象 like '%大风%' group by left(年月日,4) Having count(*)>1
      

  3.   

    是只要将第一个表的数据导入到新表中,并且统计那列清零吗?
    这样既可(假设两列 year 和 count)
    SELECT year, 0 AS [count] INTO test2
    FROM test1;
    (因为count是保留字,所以要用[])
      

  4.   

    select year, 0 into 目的表名 from 表 where  天气 = '大风' 
      

  5.   

    现在要把表a统计的数据倒入表b中
    例如:
    表a中得到是
    年    出现大风次数
    1955   1
    1957   1
    表b中是有
    年    出现大风次数(次数全为零)
    1955   0
    1956   0
    1957   0
    怎么把统计得到的数据修改到表b中呢,而且a中统计为0时年份不显示
      

  6.   

    void CGmsaDlg::OnDBSelect() 

    _RecordsetPtr Rs1;//定义Recordset对象 
    _bstr_t Connect("DSN=GMS;UID=sa;PWD=;");//定义连接字符串 
    _bstr_t Source ("SELECT count(*) FROM buaa.mdb010");//要执行的SQL语句 
    ::CoInitialize(NULL);//初始化Rs1对象 
    HRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) ); 
    //省略对返回值hr的判断 
    Rs1->Open( Source, 
    Connect, 
    adOpenForwardOnly, 
    adLockReadOnly, 
    -1 ); 
    _variant_t temp=Rs1->GetCollect(_variant_t((long)0)); 
    CString strTemp=(char* )(_bstr_t)temp; 
    MessageBox("OK!"+strTemp); 

    ----这个是我从网上找到的例子,要同时打开另一个记录集,为什么定义个_RecordsetPtr Rs2不行呢
      

  7.   

    可以打开第二个记录集了,是我的问题
    shakaqrj:你的这句SELECT year, 0 AS [count] INTO test2 FROM test1;运行不了啊
    我对第一个记录集进行搜索的语句是
    SELECT left(年月日,4) as 年,count(*) AS Expr1 FROM DateData WHERE 日天气现象 like '%大风%' group by left(年月日,4) Having count(*)>1,即每年出现“大风”的次数
      

  8.   

    或者用updata来修改:
    _bstr_t Source ("SELECT left(年月日,4) as 年,count(*) AS Expr1 FROM DateData WHERE 日天气现象 like '%大风%' group by left(年月日,4) order by 年");
    bstr_t Source2 ("UPDATE DateData LEFT JOIN YearData ON DateData.年 = YearData.年 SET DateData.Expr1 = YearData.年大风日数;");
    m_pRecordset->Open(Source, Connect, adOpenForwardOnly, adLockReadOnly, -1);
    m_pRecordset2->Open(Source2, Connect, adOpenForwardOnly, adLockReadOnly, -1);
    还是不行。。
      

  9.   

    bstr_t Source ("SELECT left(年月日,4) as 年,count(*) AS Expr1 FROM DateData WHERE 日天气现象 like '%大风%' group by left(年月日,4)order by 年");//打开日数据表进行统计
    _bstr_t Source2("UPDATA YearData SET YearData.年大风日数=DataData.Expr1 from YearData LEFT JOIN DataData58549 ON YearData.年 = DataData.年");//将统计结果更新至年数据表中
    ::CoInitialize(NULL);
    HRESULT hr = m_pRecordset.CreateInstance( __uuidof(Recordset) ); 
    HRESULT hr2 = m_pRecordset2.CreateInstance( __uuidof(Recordset) );
    m_pRecordset->Open(Source, Connect, adOpenForwardOnly, adLockReadOnly, -1);
    m_pRecordset2->Open(Source2, Connect, adOpenForwardOnly, adLockReadOnly, -1);
    这个是我最后修改的语句,用execute是只读的不能写,所以用了open形式。为什么还出错啊,真找不出原因了
      

  10.   

    m_pRecordset2->Open(Source2, Connect, adOpenForwardOnly, adLockReadOnly, -1);//只读的指针应该无法更新记录吧?adLockReadOnly?
    可以考虑这样弄。
    1 清空表b
    2 打开表a--用楼上的Select语句
    3 读写方式打开表b
    4 克隆一下表a的记录集指针.
    5 批量更新来保存表b内容
      

  11.   

    update YearData58549
    set 年大风日数 =(select count(*) FROM DateData58549 WHERE 日天气现象 like '%大风%'
     AND LEFT(年月日,4)=YearData58549.年)
    这个方法可行,希望对大家有帮助