比如 一张表中 A商品 2009-1-24,25 有数据 2009-2-23,28 有数据 2009-3-5,25,27有数据 就要以 A商品1月25 2月28 3月27为条件 这我实现了
select max(cast(gday as int)) from goodsrecord 
where goosid='A' group by gyear,gmonth但我是以这3天为条件 分别查处A商品1月25 2月28 3月27 的数据 于是我写了
select GoosID '编号',sum(gsum) '本月结存',gyear+'-'+gmonth as '时间' from GoodsRecord 
where goosid='A' and gday in (select max(cast(gday as int)) from goodsrecord 
where goosid='A' group by gyear,gmonth)
 group by goosid,gyear+'-'+gmonth我用的IN 和 sum(gsum)效果显而易见了 1月有24,25号 3月有5,25,27号 那么三月查处的是25+27号的和 因为IN后面的条件中有in(25,28,27) 3月有25和27号 又因为sum(gsum)于是3月查出来的有问题 我想问in后面的25,28,27 怎么对应1月2月3月 而不是有25,27 3月就把25,27的数据全求和了 只要有27的数据就行了 帮帮忙呀 困恼了我5天了

解决方案 »

  1.   

    其实你想得差不多了,只不过不能只关心日,还要关心月和年。
    CREATE TABLE goodsrecord(
     id INT IDENTITY
    ,goosid NVARCHAR(30)
    ,gyear INT
    ,gmonth INT
    ,gday INT
    ,gsum FLOAT
    )
    GOINSERT goodsrecord(goosid,gyear,gmonth,gday,gsum)
    SELECT 'A',2009,1,24,10
    UNION
    SELECT 'A',2009,1,25,20
    UNION
    SELECT 'A',2009,2,23,30
    UNION
    SELECT 'A',2009,2,28,40
    UNION
    SELECT 'A',2009,3,5,50
    UNION
    SELECT 'A',2009,3,25,60
    UNION
    SELECT 'A',2009,3,27,70
    GOSELECT a.*
    FROM goodsrecord a
    INNER JOIN (
            SELECT gyear,gmonth ,max(gday) as gday
            FROM goodsrecord
    WHERE goosid='A' group by gyear,gmonth ) b
    ON a.gyear = b.gyear
    AND a.gmonth = b.gmonth
    AND a.gday = b.gday
    GO不过象这种将年月日分开三个字段来储存的设计还真是少见。呵呵
      

  2.   

    谢谢你 可能我是想复杂了 把年月日分开主要是我不喜欢用TOSTRING() 变来变去很麻烦 分给你 
    楼上的两位让我很郁闷 程序员主要就是动手能力和阅读能力 如果觉得多就不看的话那会错过很多财富的 因为我们的朋友永远不会缺了帮助的