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语句给我参考,谢谢
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语句给我参考,谢谢
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 )
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
1 16
2 17
3 1 8
. .
. .
15 28
1 2 3 .. 15 是指第一栏市场名称那里的ID号
16 17 18 .. 28 是指第二栏市场名称那里的ID号
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行的。