5

データベースとして Ms アクセスを使用しており、作業時間を取得するために次のクエリを使用しています。

select 
        in_time,
        out_time,
        datediff("n",b.in_time,c.out_time) as work_time,
        log_date,
        emp_id 
from 
    (select 
        LogTime as in_time,
        SrNo,
        LogID as emp_id,
        LogDate as log_date 
    from LogTemp 
    where Type='IN' ) as b
left join
    (select 
        SrNo as out_id, 
        LogTime as out_time,
        LogID as out_emp_id,
        LogDate as out_log_date 
      from LogTemp 
     where Type = 'OUT'
     group by SrNo) as c
on (b.SrNo <> c.out_id
    and b.emp_id = c.out_emp_id
    and b.log_date = out_log_date ) 
where  
    c.out_id > b.SrNo and 
    [log_date] >= #8/20/2012# and 
    [log_date] <= #8/20/2012# and 
    emp_id = "8" 
group by b.SrNo; 

しかし、クエリを実行すると、次のエラーが発生します。

"you tried to execute a query that does not include the specified expression 'out_time'
 as an aggregate function in ms access" error.

私が間違いを犯している提案。

4

2 に答える 2

5

を実行しようとしている場合に備えて、いくつかの間違いがありますGROUP BY。まず、MSDN で GROUP BY の構文、推奨事項、およびサンプルを確認してください。

基本的に、深く掘り下げることなく、 を使用する場合、、 などの集計関数の影響を受けない句GROUP BYの列が句に表示されます。したがって、あなたの場合、次を追加する必要があります。SELECTSUMAVGGROUP BY

LogTime as out_time,
LogID as out_emp_id,
LogDate as out_log_date

2 番目のサブクエリの GROUP BY に。そして追加

 in_time,
 out_time,
 datediff("n",b.in_time,c.out_time) as work_time,
 log_date,
 emp_id 

最後にメインGROUP BYで。

しかし、あるコメントですでに指摘したように、おそらくあなたがやりたいことはORDER BY. GROUP次に、置き換えるのと同じくらい簡単でORDER、機能するはずです。それがあなたが望むものであることを確認してください。

于 2012-09-14T08:15:03.397 に答える
1

LEFT JOIN の派生テーブル C は、順序付けやグループ化を必要としません。FROM の派生テーブル B と一致してはならない理由がわかりません。

left join
    (select 
        SrNo as out_id, 
        LogTime as out_time,
        LogID as out_emp_id,
        LogDate as out_log_date 
      from LogTemp 
     where Type = 'OUT') as c

外部クエリには集計関数がないため、外部クエリの最後のステートメントは ORDER BY にする必要があります (前述のとおり)。

MS Access との一致なしでの明示的な結合に問題があると思われるので、それを WHERE ステートメントに移動することを検討してください。

 on (b.SrNo <> c.out_id
于 2012-09-14T09:42:00.050 に答える