这句sql应该怎么写?
有一个销售记录的表 ,字段是这样的 id(销售记录id) ,month(月份),week(周)
,amount(销售数量),p_id(产品id号)
我想查某月某一周每种产品的数量(按p_id升序),要求是:如果该周没有某产品记录,也要显示为空 。如果这么写 select amount from sale
where month=1
and week=1
order by p_id
就不能满足要求了!请教的说!!!
问题点数:20、回复次数:17Top
1 楼ccat(智拙)回复于 2001-10-24 08:51:46 得分 0
select nullif(amount, 0) from where month=1 and week=1
Top
2 楼wwl007(疑难杂症)回复于 2001-10-24 09:00:33 得分 0
你应该还有个商品种类维护表
假设为t1
那么可以这样。
select isnull(amonut,0) from t1 left join sale on t1.p_id=sale.p_id where sale.month=1 and
week=1 order by p_idTop
3 楼demogorgon(demo)回复于 2001-10-24 09:47:17 得分 0
不行啊,报错:[Microsoft][ODBC Microsoft Access Driver] Wrong number of arguments used with function in query expression 'isnull(amount,0)'
我把isnull删了就不报错了,但是结果还是不对,如何解决?可以解释一下isnull的意义么?
Top
4 楼demogorgon(demo)回复于 2001-10-24 10:23:42 得分 0
upTop
5 楼armadawang(wjq)回复于 2001-10-24 10:34:51 得分 0
好象要用产品的全关联:
Select B.ID,S.Amonut
from Sale S,P B
Where S.ID =* B.ID
order by b.idTop
6 楼hellospring(田甜)回复于 2001-10-24 10:56:15 得分 0
month=request("month")
week=request("week")
sqlcmd="Select amount from sale where month='"&month&"'and week='"&week&"'
con.excute(sqlcmd)
try it !Top
7 楼wwl007(疑难杂症)回复于 2001-10-24 11:14:39 得分 0
什么数据库阿我说的是sql server!
如果是oracle用nvl,别的数据库就不知道了Top
8 楼sun_jb(小字符)回复于 2001-10-24 12:56:14 得分 0
这个问题我有点不明白,既然该周没有某产品记录,该表中就不会有该产品的p_id,单靠这一张表怎么能让这种没有记录的产品显示销售数量为null呢?
如果当月当周该产品没有销售同样作为一条null的记录输入sale表,那你的SQL的写法完全没问题.Top
9 楼lovewangj(lllll)回复于 2001-10-24 13:25:55 得分 0
是不是还应该有一个产品明细表i1,如果有并且产品ID是唯一的话,可以这样:
select pid,amount from sale where.....
union
select i1.id,0 from sale from i1 where i1.id not in(select pid from sale where...)Top
10 楼GodHack(勇敢的心)回复于 2001-10-24 13:51:51 得分 0
如果按照SUN_JB的说法,则你可能假设如果你的记录有第一周和第二周但没有第三周,则你只有通过外链接才可以的
创建这样一个表专门记录月跟周数,(如MONTHWEEK表)字段为:MONTH,与WEEK 记录为1,11,2,1,3,1,4表示是一月的各周
select sale.*
from monthweek
left join sale on monthweek.month=sale.month and monthweek.week=sale.week
where sale.month=month值 and sale.week=Week值Top
11 楼GodHack(勇敢的心)回复于 2001-10-24 13:59:37 得分 20
但是如果你里面存在这条记录的话则你的就可以了如果没有存在的话,则必须要建立一条记录来关联,因为用SELECT列出的记录都是必须要建立在记录集的基础上如果没有的话,你SELECT语句再复杂也是白搭,另外,ISNULL是判断如果存在此条记录(行),且该列为空的时候可以用ISNULL来设定它的值为你想要的格式,如果根本没有此行,则肯定无效Top
12 楼demogorgon(demo)回复于 2001-10-24 14:53:03 得分 0
确实有产品的信息表Top
13 楼MountLion(闷头睡)回复于 2001-10-24 18:34:52 得分 0
GodHack所言甚是。
只需两个工作表,记录固定,一个存储1~12,另一个存储1~4,然后与销售表外连接就行了Top
14 楼carl416(小航)回复于 2001-10-24 21:43:57 得分 0
产品有无销售数量,前提是有该产品记录,数量应该是一个》=0的数值,
所以我认为:如果某一产品可能在某一周有销售记录,而在某一周有,
没有的应该设定其值为0,而不是让人难以理解的空!! 这样的话,用
很简单的语句就能得到很明确的结果,不需要多余的表单了!Top
15 楼spyer(鱼人)回复于 2001-10-24 21:57:39 得分 0
如果要保证所有产品都要有,则必须左连接:应该有一个产品表。
如果有,我们不妨假设为product,其中id为产品id字段。
select product.id as p_id,
from product left ouTop
16 楼bjay(ben)回复于 2001-10-24 22:09:31 得分 0
我同意GodHack(jason)的说法,
只有用一个产品销售流水表,一个表只有一年中的所有week,利用这两个表的外交叉,就可实现你要的功能。
另:SQL Server中的IsNull与oracle中的nvl两函数功能一样,可以使NULL字段变为0。Top
17 楼spyer(鱼人)回复于 2001-10-24 22:14:37 得分 0
如果要保证所有产品都要有,则必须左连接:应该有一个产品表。
如果有,我们不妨假设为product,其中id为产品id字段。
select product.id as p_id,
case when temp_a.amount is null then 0 else temp_a.amount end as amount,
1 as month,
1 as week
from product
left outer join
(select p_id,
sum(amount) as amount,
month,
week
from sale
where month=1 and
week=1
group by p_id,month,week ) as temp_a
on product.id=temp_a.p_id
order by product.id asc;
或者假设没有产品表,则如下:
select temp_a.p_id as p_id,
case when temp_b.amount is null then 0 else temp_b.amount end as amount,
1 as month,
2 as week
from
(select distinct p_id from sale) as temp_a
left outer join
(select p_id,sum(amount),month,week
from sale
where month=1 and
week=1
group by p_id,month,week) as temp_b
on temp_a.p_id=temp_b.p_id
order by temp_a.p_id;
关于case 语句中判断某字段是否为NULL,不同DBMS提供的方法可能有差异,可对号入座。
我所列举的是IBM DB2 的方法,SQL SERVER 的我不太清楚。希望对你有用。Top




