【 以下文字转载自 Database 讨论区 】
发信人: ex2 (d2), 信区: Database
标 题: 探讨一个 复合查询 的SQL语句
发信站: 水木社区 (Sun Feb 21 19:42:58 2010), 站内
=================问题=================
同一批销售数据放在表tab中, 形式如( item, date )
表明某天某物的一笔销售记录
现在要统计"每周"销量
需要将 每一件货物, 总销量 和 在过去15周 每周的分别销量
都同时呈现出来, 要一次过 全部弄出来,
[多次sql查询也行], 但必须一次显示
并且要求, 列出来的时候, 货物不要按名称自身排名, 而是
要按照他们的总销量排名,也就是要达到呈现出显示给客户的效果:
最好销量的货物 [上1周销量] [上2周销量] ... [上15周销量]
第二好销量的货物 [上1周销量] [上2周销量] ... [上15周销量]
第三好销量的货物 [上1周销量] [上2周销量] ... [上15周销量]
...
==================解法=================
现在想到有两种解法, 都不能仅仅用SQL本身解决,
需要借助宿主语言/客户端做额外处理
第一种解法, 步骤a[作为外循环/大循环]
先将各种货物按照销量排序好, 选出
SELECT item, count(item) as cnt
FROM tab GROUP BY item ORDER by cnt
然后用宿主语言将item一个一个选出, 假定放在变量name里面
接着步骤b[作为内循环/小循环],
按照name去查询该item的过去15个星期的分别得销量
SELECT (@today-date)/7 as week, count(item) from table
WHERE @today - date < 15*7 AND item = name
GROUP BY (@today - date)/7
这样就获得了名字为name的item的过去的分别的15周的销量
然后 输出该item的一行记录
感觉上面这样跟join 非常非常像, 但是怎么转化成JOIN
然后很方便的操作??? 想来想去想不出
============解法2==========
SELECT item,
(
SELECT COUNT(temp.name)
FROM tab as temp
WHERE tab.name = temp.name
GROUP BY temp.name
) AS totl_cnt,
(@today-tab.date)/7 as week, COUNT(item) as wk_cnt
From tab
WHERE @today - tab.date < 15*7
GROUP BY item, (@today - tab.date)/7
ORDER BY totl_cnt, week
这样是生硬的将单一货品的销售总量嵌入在 周分量的查询中,
出来的效果是:
最高总销量item, 总销量, 第1周, 第1周销量
最高总销量item, 总销量, 第2周, 第2周销量
最高总销量item, 总销量, 第3周, 第3周销量
....
最高总销量item, 总销量, 第15周, 第15周销量
次高总销量item, 总销量, 第1周, 第1周销量
次高总销量item, 总销量, 第2周, 第2周销量
....
次高总销量item, 总销量, 第15周, 第15周销量
第三高总销量item, 总销量, 第1周, 第1周销量
第三高总销量item, 总销量, 第2周, 第2周销量
....
第三高总销量item, 总销量, 第15周, 第15周销量
.....
.....
最低总销量item, 总销量, 第15周, 第15周销量
然后靠宿主程序一行一行取结果,
然后将上面每15行的结果合并, 作为一个item的一条输出
这个解法感觉也不太对....
但是想不出改进的方法, 求达人解救
--
修改:ex2 FROM 219.131.224.*
FROM 219.131.224.*