0

求人掲示板と応募者の出身地に関する分析スタイル情報を次の構造で返すクエリがあります。

クエリのデータ形式

アクセスするクエリは次のとおりです。

SELECT   g.name AS [Source]
        ,SUM(CASE WHEN v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Clicks]
        ,SUM(CASE WHEN v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Clicks]
        ,COUNT(v.id) AS [Total Clicks]
        ,SUM(CASE WHEN a.applicant = 1 AND v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Applicants]
        ,SUM(CASE WHEN a.applicant = 1 AND v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Applicants]
        ,SUM(CASE WHEN a.applicant = 1 THEN 1 ELSE 0 END) AS [Total Applicants]
        ,SUM(v.cost/100.0) AS [Spend]
FROM a_views v
LEFT OUTER JOIN a_views a
    ON v.viewerid = a.viewerid
    AND v.sessionsourceid = a.sessionsourceid
    AND a.applicant = 1
JOIN a_sources s
    ON v.sourceid = s.id
JOIN a_sourcegroups g ON s.fk_sourcegroup = g.id
--JOIN jobs j ON v.jobid = j.anal_id AND j.featured = 1
WHERE v.hostName = @jobboard
    AND v.viewed_at >= @start AND v.viewed_at <= @end
GROUP BY g.name

唯一の問題は、LEFT OUTER JOIN a_viewsブロック内に複数のレコードが返される可能性があることです。私がする必要があるのは、合計で1回だけレコードを追跡することですが、Click合計でレコードが見つかるたびに追跡しApplicantます。

私はこの質問でこれが起こっているのと同様の質問を見つけましたが、回答者は実際には多くの情報を提供しませんでした。

必要なものを再開するには、結合の右側にあるレコードの各インスタンスですが、左側にあるレコードのインスタンスは1つだけです。

4

2 に答える 2

0

クエリを完全に変更せずにこれを行う1つの方法は、クリック合計と申請者合計を2つの別々のクエリに分割し、UNIONそれらをグループ化してから再度グループ化/合計することです。

このようなもの(擬似コード):

SELECT
        Source
        ,SUM([Organic Clicks])
        ,.....
FROM
(
SELECT   g.name AS [Source]
        ,SUM(CASE WHEN v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Clicks]
        ,SUM(CASE WHEN v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Clicks]
        ,COUNT(v.id) AS [Total Clicks]
        ,0 AS [Organic Applicants]
        ,0 AS [Paid Applicants]
        ,0 AS [Total Applicants]
        ,SUM(v.cost/100.0) AS [Spend]
FROM
        ClickOnlyTables

UNION ALL

SELECT   g.name AS [Source]
        ,0 AS [Organic Clicks]
        ,0 AS [Paid Clicks]
        ,0 AS [Total Clicks]
        ,SUM(CASE WHEN a.applicant = 1 AND v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Applicants]
        ,SUM(CASE WHEN a.applicant = 1 AND v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Applicants]
        ,SUM(CASE WHEN a.applicant = 1 THEN 1 ELSE 0 END) AS [Total Applicants]
        ,0 AS [Spend]
FROM
        ApplicantTables
)
GROUP BY
        Source
于 2012-12-11T17:55:48.783 に答える
0

どういうわけか、私はあなたがこの質問に答えるために自己参加したくないと思います。おそらく、a_viewsを集約するだけで、最初に申請者によって、次にゲームによって問題が解決されます。

クエリから何を意図しているのかを判断するのは難しいと思いますが、最初の集計としては次のようになります。

select g.name, valuationDups.viweerid, v.sessionsourceid,
       SUM(CASE WHEN v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Clicks],
       SUM(CASE WHEN v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Clicks],
       COUNT(v.id) AS [Total Clicks],
       SUM(CASE WHEN a.applicant = 1 AND v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Applicants],
       SUM(CASE WHEN a.applicant = 1 AND v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Applicants],
       SUM(CASE WHEN a.applicant = 1 THEN 1 ELSE 0 END) AS [Total Applicants],
       SUM(v.cost/100.0) AS [Spend]       
FROM a_views v JOIN
     a_sources s
     ON v.sourceid = s.id JOIN
     a_sourcegroups g
     ON s.fk_sourcegroup = g.id
WHERE v.hostName = @jobboard and
      v.viewed_at >= @start AND
      v.viewed_at <= @end
group by g.name, valuationDups.viweerid, v.sessionsourceid

そして、g.nameで再度集計します。

于 2012-12-11T18:51:22.920 に答える