2

現在、3つの別々のSQL呼び出しを実行しています。グリッドが適切にソートされるように、可能であればそれらを1つにまとめたいと思います。

私は4つの別々のテーブルで作業しています

BlastAnalytics-次の列があり、太字は値が必要な列です... id(primaryKey)、eventType、BlastID、email、ts、bounceDesc

BlastJobs-次の列があり、太字は値が必要な列です... JobNumber(primaryKey)、MessageFrom、MessageHeader

BlastOpens-id(primaryKey)、AnalyticsID、ts

BlastClicks-id(primaryKey)、AnalyticsID、ts

結合は...BlastAnalytics.BlastID->BlastJobs.JobNumber BlastAnalytics.id-> BlastOpens.AnalyticsID BlastAnalytics.id-> BlastClicks.AnalyticsID

現在、次のSQLステートメントを実行してグリッドをバインドしています...

SELECT BlastAnalytics.eventType, BlastAnalytics.BlastID, BlastAnalytics.email, 
  BlastAnalytics.ts, BlastAnalytics.bounceDesc, BlastJobs.MessageFrom, 
  BlastJobs.MessageHeader
FROM BlastAnalytics INNER JOIN
  BlastJobs ON BlastAnalytics.BlastID = BlastJobs.JobNumber
WHERE (BlastAnalytics.eventType <> 'open') 
 AND (BlastAnalytics.eventType <> 'click') 
 AND (BlastAnalytics.BlastID = @BlastID)
ORDER BY BlastAnalytics.ts DESC

次に、grid1_RowDataBoundで(個々の行が作成されるとき)、次のステートメントを実行してカウントを取得します。

SELECT COUNT(*) AS OpenCount, BlastAnalytics.email
FROM BlastAnalytics INNER JOIN
  BlastOpens ON BlastAnalytics.id = BlastOpens.AnalyticsID
WHERE (BlastAnalytics.BlastID = @BlastID) 
  AND (BlastAnalytics.email = @email)

SELECT COUNT(*) AS ClickCount, BlastAnalytics.email
FROM BlastAnalytics INNER JOIN
  BlastClicks ON BlastAnalytics.id = BlastClicks.AnalyticsID
WHERE (BlastAnalytics.BlastID = @BlastID) 
  AND (BlastAnalytics.email = @email)

これはすべて正常に機能しますが、GROUP BYなどを使用して、これらのステートメントを1つにまとめることができるはずですが、その方法がわかりません。

編集

これは、テーブル内のデータのタイプの例です...

BlastOpensテーブル

id     AnalyticsID    ts     BlastID
2958   38289   1358546399   479
2959   38852   1358546391   479
2960   38280   1358546391   479
2961   38280   1358546400   479
2965   38282   1358546396   480
2986   38284   1358546398   480

BlastAnalyticsテーブル

id  eventType   BlastID   email   ts   bounceDesc
38280   open   479  blahblah@blah.com   1358546555  NULL
38289   open   479  blahblah@blah.com   1358546555  NULL
38352   open   479  itsa@test.com   1358550528  NULL
38115   send   479  blahblah@blah.com   1358545375  NULL

したがって、上記の例では、blahblah @ blah.comの合計オープンカウントは3であり、itsa@test.comの合計オープンカウントは1です。

4

1 に答える 1

0

私はこれをテストしていませんが、RDBMSがサブクエリをサポートしていると仮定すると、このようなものが機能するはずです。

SELECT BlastAnalytics.eventType, BlastAnalytics.BlastID, BlastAnalytics.email, 
   BlastAnalytics.ts, BlastAnalytics.bounceDesc, BlastJobs.MessageFrom, 
   BlastJobs.MessageHeader, 
   BO.OpenCount,
   BC.ClickCount
FROM BlastAnalytics 
   INNER JOIN BlastJobs ON BlastAnalytics.BlastID = BlastJobs.JobNumber
   LEFT JOIN (
      SELECT COUNT(*) AS OpenCount, BlastAnalytics.BlastID, BlastAnalytics.email
      FROM BlastAnalytics INNER JOIN
         BlastOpens ON BlastAnalytics.id = BlastOpens.AnalyticsID
      GROUP BY BlastAnalytics.BlastID, BlastAnalytics.email
   ) BO ON BlastAnalytics.BlastID = BO.BlastID AND BlastAnalytics.Email = BO.Email
   LEFT JOIN (
      SELECT COUNT(*) AS ClickCount, BlastAnalytics.BlastID, BlastAnalytics.email
      FROM BlastAnalytics INNER JOIN
         BlastClicks ON BlastAnalytics.id = BlastClicks.AnalyticsID
      GROUP BY BlastAnalytics.BlastID, BlastAnalytics.email
   )  BC ON BlastAnalytics.BlastID = BC.BlastID AND BlastAnalytics.Email = BC.Email
WHERE (BlastAnalytics.eventType <> 'open') 
   AND (BlastAnalytics.eventType <> 'click') 
   AND (BlastAnalytics.BlastID = @BlastID)
ORDER BY BlastAnalytics.ts DESC

幸運を。

于 2013-01-23T02:54:26.437 に答える