This topic has been archived. It cannot be replied.
-
工作学习 / 专业技术讨论 / 我也有个SQL难题, 请教高手:Table结构是: id, m1, m2, m3, ..., m12
我需要根据现在的月份(这个我知道怎么用SQL得到, 姑且记做@m吧), 算出m1 + m2 + ... + m(@m), 也就是business中常用的year-to-date.
我以前是在程序里面算的, 现在想改成直接用SQL算. 不知道能不能做到?
多谢!
-poohbear(毛毛熊);
2006-10-13
{241}
(#3261474@0)
-
可以动态生成SQL,用 Exec执行。不过你的数据表由问题。怎莫这样设计?
-nealzhao(neal);
2006-10-14
(#3261513@0)
-
表不是我设计的. 我只能拿来用. 我现在想用静态的SQL实现, 也就是没有程序帮忙.
-poohbear(毛毛熊);
2006-10-14
(#3261574@0)
-
这个很难嘛? 如果你的mi1..m12都是number的话,select(m1+m2+m3...+m12) as YTD from table where...不就完了嘛?
-hard(hard);
2006-10-14
(#3261556@0)
-
那就是year-end, 不是 year-to-date了
-poohbear(毛毛熊);
2006-10-14
(#3261580@0)
-
哦,又没注意看题...那就写个stored procedure吧,把月份作为参数传进去,动态build select语句.把你的m1 到 m12在sp里面做出来.
-hard(hard);
2006-10-14
{598}
(#3261611@0)
-
多谢! 明天试试去!
-poohbear(毛毛熊);
2006-10-15
(#3264232@0)
-
我现在想到的是一种笨办法: 把m1 ... m12选在12个参数里面, 然后用12个if ... 应该可行, 是不是? 不过显得太苯了... 大家能不能想到更好的办法?
-poohbear(毛毛熊);
2006-10-14
(#3261579@0)
-
try this..select decode(
to_char(sysdate,'mm'),
'01', m1,
'02', m1+m2,
'03', m1+m2+m3,
........
'12',m1+m2+m3+.......+m12)
from xxxx
where xxxxxxxx
-bluebluesky(bluebluesky);
2006-10-14
{198}
(#3261607@0)
-
这个思路还不错,不过总感觉应该可以更好。不过我没想到。。8-p
-xfile(xfile);
2006-10-14
(#3261868@0)
-
多谢! 比我的设想(12个IF)好看多了, 明天试试.
-poohbear(毛毛熊);
2006-10-15
(#3264221@0)
-
如果为了美观的话,try this
-886xyz(cqcq);
2006-10-14
{607}
(#3262150@0)
-
确实美观多了. 明天试试. 多谢!
-poohbear(毛毛熊);
2006-10-15
(#3264227@0)
-
这种方法可能会扫描表多次,降低效率。我建议采用静态SQL,这里已经有许多朋友给出了很好的方案。12种CASE一点也不算多。动态SQL难维护,有安全隐患,即使有BUG在编译期间也不知道,所以应该作为最后选择。
-newkid(newkid);
2006-10-16
(#3265085@0)
-
You need to build query conditions based on current date. For YTD, your date range shall be 1/1/2006 and current month -1 (last month end).
-23456789(大白呼);
2006-10-15
(#3263986@0)
-
谢谢, logic都是business定的, 这些我自己都做好了, 其实原表没有id. 而是什么公司, 客户, 年份之类的. 我没有详细写在贴子里, 是想突出我自己觉得不好解决的SQL部分.
-poohbear(毛毛熊);
2006-10-15
(#3264245@0)
-
多谢楼上朋友们, 坛子里真是SQL高手众多, 我自己深感惭愧 -- TSQL, PL/SQL我也写了不少了, 跟高手一比还是差远了. 以后会多来请教.
-poohbear(毛毛熊);
2006-10-15
(#3264252@0)
-
两种方法供参考:1 使用临时表 2 使用case语句. 建议用标量函数(scaler function)封装
-digitworm(digitworm);
2006-10-15
{2342}
(#3264266@0)
-
谢谢. 记下了, 明天两种方法都试一试. 我个人觉得临时表没有省下太多code, 似是大材小用了. CASE好象不是SQL定义的, 不知道我们SQL SERVER行不行, 先试试再说了.
-poohbear(毛毛熊);
2006-10-15
(#3264293@0)
-
MS SQL 2000/2005 支持case
-digitworm(digitworm);
2006-10-15
(#3264311@0)
-
再谢, 那就应该一点问题都没有了 -- 有的话就是我个人的脑筋了 ^_^
-poohbear(毛毛熊);
2006-10-15
(#3264320@0)
-
使用局部变量可以减少select语句,具体性能差异需要自己比较一下再决定采用哪种
-digitworm(digitworm);
2006-10-15
{1070}
(#3264351@0)
-
Thank you!!
-poohbear(毛毛熊);
2006-10-15
(#3264484@0)
-
downstair "looi500" gave a good idea for just using one select statement without using local variables, see #3264399. for your app just using "@m" replaces "MONTH(CURRENT_TIMESTAMP)" in the sql.
-digitworm(digitworm);
2006-10-16
(#3265196@0)
-
使用case
-looi500(looi);
2006-10-15
{965}
(#3264399@0)
-
Thank you!
-poohbear(毛毛熊);
2006-10-15
(#3264476@0)