0

2つの日付間の平均月数の差を取得しようとしています:

select client_id, 
        avg(12*(year(MAX(received_date))-year(min(received_date))) 
        + MONTH(MAX(received_date))-MONTH(min(received_date)))
        from tmpTwoAccessions
        group by CLIENT_ID,PATIENT_ID

次のメッセージが表示されます。

Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

ここで私が間違っていることについて教えてください。ご指導ありがとうございました。

4

3 に答える 3

3

次のようなサブクエリを使用してみてください。

select
    T.client_id
    ,avg(T.ReceivedDateDiff)
from 
(
    select client_id, 
    (12*(year(MAX(received_date))-year(min(received_date))) 
        + MONTH(MAX(received_date))-MONTH(min(received_date))) AS ReceivedDateDiff
    from tmpTwoAccessions
    group by CLIENT_ID,PATIENT_ID
)
T
GROUP BY client_id
于 2012-10-16T06:13:44.703 に答える
2

サブクエリで MAX と MIN の差を計算し、それを外側のクエリで平均します。

SELECT client_id, AVG(delta_date)
  FROM (SELECT client_id, patient_id,
               12 * (YEAR(MAX(received_date))-YEAR(MIN(received_date))) 
               + MONTH(MAX(received_date)) - MONTH(MIN(received_date))) AS delta_date
          FROM tmpTwoAccessions
         GROUP BY client_id, patient_id
       ) AS x
 GROUP BY client_id;

あなたの日付差の表現が最適であるとは確信していませんが、それを変更しようとはしていません。


Yurly Rozhovetskiyは次の表現を提案しました。

DATEDIFF(MONTH, MIN(received_date), MAX(received_date))

私には良さそうです。改訂されたクエリは次のようになります。

SELECT client_id, AVG(delta_date)
  FROM (SELECT client_id, patient_id,
               DATEDIFF(MONTH, MIN(received_date), MAX(received_date)) AS delta_date
          FROM tmpTwoAccessions
         GROUP BY client_id, patient_id
       ) AS x
 GROUP BY client_id;
于 2012-10-16T06:13:58.127 に答える
2

DATEDIFF で実装する方がクリーンです。

WITH tmpTwoAccessionsMonths AS(         
    select 
          client_id
        , PATIENT_ID
        , DATEDIFF(month,MIN(received_date),MAX(received_date)) MonthDifference
    from 
        tmpTwoAccessions
    group by 
        CLIENT_ID,PATIENT_ID
)
SELECT
    client_id
    ,AVG(MonthDifference)
FROM
    tmpTwoAccessionsMonths
GROUP BY
    client_id
于 2012-10-16T13:50:40.193 に答える