这个问题能用一条SQL语句搞定吗?(17分)

  • 主题发起人 主题发起人 delphi_初学者
  • 开始时间 开始时间
D

delphi_初学者

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个表包含字段:物品编码,规格,数量,单价等等
比方有如下数据:
0111120401 1x2x0.4 10 120.00
0111120501 1x2x0.5 20 134.24
0112480401 4x8x0.5 60 124.56
0111120401 1x2x0.4 30 122.00
0111120501 1x2x0.5 20 134.24
0112480401 4x8x0.5 40 124.56
01134100401 4x10x0.4 30 124.20
要求在DBGrid中显示如下格式的数据:
1x2 4x8 4x10
0.4 40 0 30
0.5 40 100 0
如果用一条SQL语句不能解决的话,有什么方法可以实现?
不好意思,17分是我所有的分了:)
 
我觉得没问题,关键是找到合适的函数把X*Y*Z分解成X*Y和Z。
不同的数据库方法不同。
 
用case 语句
 
能把具体的语句写出来吗?
 
我跟,行列转换如何做
 
各位,别光说嘛,写上你的SQL语句行不?
 
select a.bb,a.aa,sum(数量) from
(select 编码,left(规格,length(规格)-4) As aa,right(规格,3) As bb,数量,单价 from table1) a
group by a.aa,a.bb
有点接近了,变成
0.4 1x2 40
0.4 4x8 0
0.4 4x10 30
...
再想想
 
//tablename = tb;columns = 'a', 'b', 'c', 'd'
a b c d
0111120401 1x2x0.4 10 120.00
0111120501 1x2x0.5 20 134.24
0112480401 4x8x0.5 60 124.56
0111120401 1x2x0.4 30 122.00
0111120501 1x2x0.5 20 134.24
0112480401 4x8x0.5 40 124.56
01134100401 4x10x0.4 30 124.20
//get sql.text like the following:
select right(rtrim(b), 3) as x,
sum(case left(rtrim(b), len(rtrim(b)) - 3) when '1x2' then c else 0 end) as 1x2,
sum(case left(rtrim(b), len(rtrim(b)) - 3) when '4x8' then c else 0 end) as 4x8,
sum(case left(rtrim(b), len(rtrim(b)) - 3) when '4x10' then c else 0 end) as 4x10
from tb
group by right(rtrim(b), 3)
order by right(rtrim(b), 3)
 
to:dlnew
执行后的结果为:
1x2 4x8 4x10
0.4 0 0 0
0.5 0 0 0
数量的合计没有统计出来
 
我不信,亲自试过的,没错,把你的sql.text贴出来!
 
to:dlnew
我是照抄你的,如下:
SELECT RIGHT(rtrim(规格), 3) AS x, SUM(CASE LEFT(rtrim(规格), len(rtrim(规格)) - 3)
WHEN '1x2' THEN 数量 ELSE 0 END) AS AAA, SUM(CASE LEFT(rtrim(规格),
len(rtrim(规格)) - 3) WHEN '4x8' THEN 数量 ELSE 0 END) AS BBB,
SUM(CASE LEFT(rtrim(规格), len(rtrim(规格)) - 3)
WHEN '4x10' THEN 数量 ELSE 0 END) AS CCC
FROM DXiaoShouDingDan2
GROUP BY RIGHT(rtrim(规格), 3)
ORDER BY RIGHT(rtrim(规格), 3)

因为在 AS 后面用‘1x2’的形式执行时有如下提示:

[Microsoft][ODBC SQL Server Driver][SQL Server]line 1:Incorrect sytax new '1'.

所以在 AS 后面改为‘AAA’的形式,其它都一样

 
....WHEN '1X2' THEN 数量 ELSE 0 END....
不就是少了一个'x'吗?!
LEFT(rtrim('1x2x0.4'), len(rtrim('1x2x0.4')) - 3) = '1x2x'!
我试的时候是用自己的数据库在试的,写出来后可能会有错,
不过仔细检查一下是查得出来的!
 
1x2 4x8 4x10
规格是不确定的吗?不止三种是吗?
 
我是用的SQL Server 7.0,你试一下就知道了
 
//tablename = tb;columns = 'a', 'b', 'c', 'd'
a b c d
0111120401 1x2x0.4 10 120.00
0111120501 1x2x0.5 20 134.24
0112480401 4x8x0.5 60 124.56
0111120401 1x2x0.4 30 122.00
0111120501 1x2x0.5 20 134.24
0112480401 4x8x0.5 40 124.56
01134100401 4x10x0.4 30 124.20
//get sql.text like the following:
select right(rtrim(b), 3) as x,
sum(case left(rtrim(b), len(rtrim(b)) - 4) when '1x2' then c else 0 end) as 1x2,
sum(case left(rtrim(b), len(rtrim(b)) - 4) when '4x8' then c else 0 end) as 4x8,
sum(case left(rtrim(b), len(rtrim(b)) - 4) when '4x10' then c else 0 end) as 4x10
from tb
group by right(rtrim(b), 3)
order by right(rtrim(b), 3)

应该减4
 
谢谢SS2000,你的方法是正确的,应该-4才对
 
后退
顶部