SQL数据里共有以下字段:市场id  市场名称 产品类型 上午 下午 送货日期 ,由于我在datagridview中要分几栏显示的,目的是为了能够清晰明了,比如市场共有50个,其中1--15为第一栏,16--28为第二栏,29--50为第三栏的话,我应该怎么去操作呢?目前我只能做一栏,SQL语句如下SELECT     市场名称,    SUM(CASE WHEN 产品类型 = '黄豆' THEN 上午 ELSE NULL END) AS '黄豆上午', 
                      SUM(CASE WHEN ghjilugoodstype = '黄豆' THEN 下午 ELSE NULL END) AS '黄豆下午', 
                      SUM(CASE WHEN ghjilugoodstype = '红豆' THEN 上午 ELSE NULL END) AS '红豆上午', 
                      SUM(CASE WHEN ghjilugoodstype = '红豆'  THEN 下午 ELSE NULL END) AS '红豆下午'
FROM         送货记录
WHERE     (送货日期 = '2010-9-29') 
GROUP BY 市场名称, 送货日期, 市场id结果显示为一栏的数据,不是我想要的结果,但我只能这样子了,怎么也想不了,本人初学的。我分三栏的意思是为了按照送货车排版的,所以好想要这个显示。希望各位能帮我写一下SQL语句给我参考,谢谢

解决方案 »

  1.   

    SELECT  SUM(CASE WHEN 产品类型 = '黄豆' THEN 上午 ELSE NULL END) AS '黄豆上午',  
      SUM(CASE WHEN ghjilugoodstype = '黄豆' THEN 下午 ELSE NULL END) AS '黄豆下午',  
      SUM(CASE WHEN ghjilugoodstype = '红豆' THEN 上午 ELSE NULL END) AS '红豆上午',  
      SUM(CASE WHEN ghjilugoodstype = '红豆' THEN 下午 ELSE NULL END) AS '红豆下午'
    FROM 送货记录
    WHERE (送货日期 = '2010-9-29')  
    GROUP BY (市场id /16 )
      

  2.   

    比如  市场ID   市场名称   产品类型   送货日期  上午  下午
           1           沙河市场    黄豆    2009-10-14   20   30  
           2           白玉商场     红豆    2009-10-14   25   50
          3           世纪广场     黄豆     2009-10-14   26  39 
          4           新乐广场     黄豆     2009-10-14   25   85
          2           白玉商场      黄豆     2009-10-14   21  13
    ............................................................
    如果是一个商场拿2种不同的产品类型的话,市场ID是一样的.总共市场有50个,也就是市场ID最多是50
    在datagridview 中是按1--15为第一栏,16--28为第二栏,29--50为第三栏这样子分也就是市场名称  黄豆上午  黄豆下午 红豆上午红豆下午 市场名称   黄豆上午   黄豆下午  红豆上午  红豆下午 
        1                                      16
        2                                      17
        3                                       18
        .                                        .
        .                                        .
        15                                        28
           
      

  3.   

    市场名称 黄豆上午 黄豆下午 红豆上午红豆下午 市场名称 黄豆上午 黄豆下午 红豆上午 红豆下午   
      1 16
      2 17
      3 1 8
      . .
      . .
      15 28
    1 2 3 .. 15 是指第一栏市场名称那里的ID号
    16 17 18 .. 28 是指第二栏市场名称那里的ID号
      

  4.   


    select *
    from (select ROW_NUMBER() over (order by id) as aid,name,
    sum(case when type='黄豆' then am else null end)as 黄豆上午,
    sum(case when type='黄豆' then pm else null end)as 黄豆下午,
    sum(case when type='红豆' then am else null end)as 红豆上午,
    sum(case when type='红豆' then pm else null end)as 红豆下午
    from tb
    where id between 1 and 15
    group by id,name)a     --第一栏
    left join 
    (select ROW_NUMBER() over (order by id) as bid,name,
    sum(case when type='黄豆' then am else null end)as 黄豆上午,
    sum(case when type='黄豆' then pm else null end)as 黄豆下午,
    sum(case when type='红豆' then am else null end)as 红豆上午,
    sum(case when type='红豆' then pm else null end)as 红豆下午
    from tb
    where id between 16 and 28
    group by id,name)b on b.bid=a.aid   --联接第二栏
    left join
    (select ROW_NUMBER() over (order by id) as cid,name,
    sum(case when type='黄豆' then am else null end)as 黄豆上午,
    sum(case when type='黄豆' then pm else null end)as 黄豆下午,
    sum(case when type='红豆' then am else null end)as 红豆上午,
    sum(case when type='红豆' then pm else null end)as 红豆下午
    from tb
    where id between 29 and 50
    group by id,name)c on c.cid = a.aid   --联接第三栏
    思路:1利用Where条件分别查询出三张表a,b,c
          2,利用OW_NUMBER() over (order by id) as 列名,进行自然排序,为Left join作准备
          3使用select * 对三张表进行左联接
    问题:这种方法能有你想要的结果,不过仍然有一个问题,就是如果A表中的行数少于其它表的行数,那么只能显示A表中的那么多行数。一个比较好的解决办法是对C表先进行一次左外联接(C表行数可能最多)得到1~22的排序,然后再利用左外联接后的C表作为主表,对AB表进行左外联接,这样才能确保万无一失。你得到的数据才能保证是22行的。
      

  5.   

    用三个datagridview 还快些。