这么一条SQL语句该怎么写? (50分)

  • 主题发起人 主题发起人 lixx
  • 开始时间 开始时间
L

lixx

Unregistered / Unconfirmed
GUEST, unregistred user!
有如下一表(Access数据库):

其中字段类型分别为:

DateTime为时间/日期型
voltage 为单精度浮点型
如何由表1变成表的形式?

表1 表2
+-----------------------+-----------+ +-------------+--------+---------+--------+
| DateTime1 | voltage | | DateTime2 | 1点 | 2点 | 3点 |
+-----------------------+-----------+ +-------------+--------+---------+--------+
| 2001-10-01 01:00:00 | 123.456 | // |2001-10-01 | 123.456| 223.232 |333.432 |
+-----------------------+-----------+ ______// +-------------+--------+---------+--------+
| 2001-10-01 02:00:00 | 223.232 | ________》 |2001-10-02 | 123.456| 223.232 |333.432 |
+-----------------------+-----------+ // +-------------+--------+---------+--------+
| 2001-10-01 03:00:00 | 333.432 | // |2001-10-03 | 123.456| 223.232 |333.432 |
+-----------------------+-----------+ +-------------+--------+---------+--------+
| 2001-10-02 01:00:00 | 223.122 |
+-----------------------+-----------+
| 2001-10-02 02:00:00 | 233.325 |
+-----------------------+-----------+
| 2001-10-02 03:00:00 | 523.496 |
+-----------------------+-----------+
| 2001-10-03 01:00:00 | 873.556 |
+-----------------------+-----------+
| 2001-10-03 02:00:00 | 673.452 |
+-----------------------+-----------+
| 2001-10-03 03:00:00 | 893.426 |
. .
. .
. .
 
如果数据量不大,使用临时表八。这样思路清晰一点。
 
如果用oracle 就很容易实现 用access 不懂:)
 
表2的格式能固定吗
 
遗憾的是数据量有点大
我想用类似于下面的SQL语句那么写,可能会解决问题,但有些小细节我解决不了.
select datetime ,1clock.voltage as'1点',2clock.voltage as '2点',3clock.voltage as '3点'
from
(select voltage from tbl1 where (datetime='01:00:00'))1clock,
(select voltage from tbl1 where (datetime='02:00:00'))2clock,
(select voltage from tbl1 where (datetime='03:00:00'))3clock

问题的关键是:
表1中的DateTime是时间/日期型的(即有时间又有日期),而表2是只是日期,
还有查询条件中,只是限制时间而不限制日期,直接像上面那么写却不行!

表2的格式是固定的.
 
我把oracle的写出来让大家参考
SELECT SUM(DECODE(TO_CHAR(DATETIME,'HH'),01,VOLTAGE,0)) 1点,
SUM(DECODE(TO_CHAR(DATETIME,'HH'),02,VOLTAGE,0)) 2点,
SUM(DECODE(TO_CHAR(DATETIME,'HH'),03,VOLTAGE,0)) 3点 FROM 表1 GOURP BY
TO_CHAR(DATETIME,'HH');
 
ORACLE 中的实现方法,ACCESS可以用IF函数代替DECODE函数来做。
select to_char(datetime,'yyyy-mm-dd') datetime,
sum(decode(to_char(datetime,'hh'),'01',voltage,0)) 1点,
sum(decode(to_char(datetime,'hh'),'02',voltage,0)) 2点,
sum(decode(to_char(datetime,'hh'),'03',voltage,0)) 3点
group by to_char(datetime,'yyyy-mm-dd')
 
明白拉:)
 
不知li2能否用Access数据库可用的函数写一下上面的SQL语句?
 
用if 代替decode
select to_char(datetime,'yyyy-mm-dd') datetime,
sum(if(to_char(datetime,'hh'),'01',voltage,0)) 1点,
sum(if(to_char(datetime,'hh'),'02',voltage,0)) 2点,
sum(if(to_char(datetime,'hh'),'03',voltage,0)) 3点
group by to_char(datetime,'yyyy-mm-dd')
 
SQL语句出错
我是这么写的(由于怕出现使用关键字的错误,所以我把dateTime改成了datetime1和datetime2)

with query1 do
begin
Close;
sql.add('select to_char(,"yyyy-mm-dd")as datetime2,');
sql.add('sum(if(to_char(datetime1,"hh"),"01",voltage,0))as 1点,');
sql.add('sum(if(to_char(datetime1,"hh"),"02",voltage,0))as 2点,');
sql.add('sum(if(to_char(datetime1,"hh"),"03",voltage,0))as 3点,');
sql.add('from test');//Test为表1的名子
sql.add('group by to_char(datetime,"yyyy-mm-dd")');
Open;
end;
以上执行出错!
另Access中与To_char相对应的函数是什么?
正确写法还请各位帮助一下!

 
我使用下面的语句已经基本将问题解决了,可是还有一个我暂时无法解决的问题:
下面语句查询出来的结果有大量的重复记录,如何加入条件,我暂时没有好方法,还请各位出手
with query1 do
begin
Close;
sql.clear;
sql.add(' select datevalue(tbl1.datetime1) as "日期",a.voltage as "1点" ');
sql.add(' ,b.voltage as "2点" ');
sql.add(' ,c.voltage as "3点"');
sql.add(' from tbl1,');
sql.add('( select datetime1,voltage from tbl1 where timevalue(datetime1)=:one)a, ');
sql.add('( select datetime1,voltage from tbl1 where timevalue(datetime1)=:two)b, ');
sql.add('( select datetime1,voltage from tbl1 where timevalue(datetime1)=:three)c ');
parambyname('One').asdatetime:=strtotime('01:00:00');
parambyname('two').asdatetime:=strtotime('02:00:00');
parambyname('three').asdatetime:=strtotime('03:00:00');
Open;
end;
以上结果有大量的重复,采用Group by 但是又都不对(可能是我加的不对)
 
高手们,回答呀,不能因为问题太简单就不回答吧。
 
多人接受答案了。
 
后退
顶部