2017-12-02 18 views
0

私はこの質問を正しく聞いているかどうかはわかりません。アルゴリズム的に私は何をしたいのか分かっていますが、SQLの適切な構文は分かりません。基準に基づいて合計の列合計sql

私は、顧客番号、IP、セッションの開始時間、およびセッションの合計時間によるオンラインセッションの合計時間を含むテーブルを作成しました。ここで(IPとCUSTNOも、テーブルはとてもおかしな言い訳を作る方法がわからマスクされていない)、このテーブルがどのように見えるかの例です:

CustNo minDate     maxDate     ClientIp timeDiff 
123456 2017-11-14-02:39:27.093 2017-11-14-02:39:59.213 1.1.1.1 0.000372 

私はその後、活動の特定の種類を探して、別のテーブルを作成し、この特定のアクティビティの前にこの特定のユーザがそのIPをどれくらいの期間使用したかを知りたい。 2番目のテーブルには、各アクティビティが個別の行、customerID、IP、およびタイムスタンプとして含まれています。

ここまでは問題ありません。テーブルは上手く見えます。

顧客IDとIPに基づいて最初のテーブルを調べる部分を記述してから、セッションの開始時間がアクティビティ時間よりも短ければその顧客のIPの使用量を合計する必要がありますどのようにこれを行うには分かりません。ここには現在の機能があります(明らかに機能していません)。これは新しいIPになる可能性があり、最初のテーブルにない可能性があるため、左結合を実行しています。

SELECT 
    *, 
    SUM(##finalSessionSums.timeDiff) 
FROM 
    ##allTransfersToDiffReceip 
LEFT JOIN 
    ##finalSessionSums ON ##allTransfersToDiffReceip.CustNo = ##finalSessionSums.CustNo 
         AND ##allTransfersToDiffReceip.ClientIp = ##finalSessionSums.ClientIp 
         AND ##allTransfersToDiffReceip.[DateTime] < ##finalSessionSums.minDate 

私はここで集約関数のエラーを取得しますが、私はこのアプローチにどうやってアプローチするのか分かりません。

+1

受信する正確なエラーとそのデータの予想される結果明らかに。 –

+0

エラーは何ですか? 2番目のテーブルのサンプルデータを提供してください。 – sia

+0

あなたの質問には既に回答していますか? – Nikolaus

答えて

1

SELECT *(すべての列を返します)と集計関数(この場合はSUM)があります。返品用に特定の列を集約して集計した値を集計する場合は、GROUP BY句のSELECT句に指定されている各列を指定する必要があります。いくつかの情報の原因で

SELECT 
    A, B, SUM(C) as CSum 
FROM 
    Table 
GROUP BY 
    A, B 
0

例えば、私は完璧なソリューションを提供することはできませんが、私はそれを試してみるよ:

まずアランが述べたように、あなただけの列を選択する必要があります集計関数に必要なものはCustommerNoとIpです。クエリの合計を取得するには、次のようにグループ化する必要があります。

SELECT sum(s.timeDiff) as Sum, s.custNo, s.Ip 
FROM ##finalSessionSums s 
INNER JOIN ##allTransfersToDiffReceip a on a.CustNo = s.CustNo 
AND a.ClientIp = s.ClientIp 
AND a.[DateTime] < s.minDate 
GROUP BY s.custNo, s.Ip; 
関連する問題