2011-06-12 13 views
3

ここに私の問題があります。ここに例があります:問題別SQLグループ

DateTime    Campaign 
2011-06-01 08:55:00 Campaign1 
2011-06-01 08:56:00 Campaign1 
2011-06-01 08:57:00 Campaign2 
2011-06-01 08:58:00 Campaign1 
2011-06-01 08:59:00 Campaign1 

私はキャンペーンごとにグループ化したいが、同じものであればよい。 私は期待結果は次のとおりです。

DateTime    Campaign Count 
2011-06-01 08:55:00 Campaign1  2 
2011-06-01 08:57:00 Campaign2  1 
2011-06-01 08:58:00 Campaign1  2 

たびキャンペーンのIグループ、私はCampaign1

Select *, Count(Campaign) as Count from myTable group by Campaign 

で一つだけの行を取得しますが、任意のアイデアを

DateTime    Campaign Count 
2011-06-01 08:55:00 Campaign1  4 
2011-06-01 08:57:00 Campaign2  1 

で結果を持っていますかどのように私は望みの結果を得ることができましたか?

ありがとうございました!

+0

あなたのテーブル構造を投稿してください。キャンペーンの列でない場合は、ここでグループ化しようとしているものを特定することは難しいです... –

+0

これは2つの列についてです。テーブルは、DateTimeによって並べ替えられます。私はそのグループの日時順を尊重したい。そこでCampaing2が満たされるまでCampaign1をグループ化します。 Campaign2をまとめてグループ化するよりも他のキャンペーン1がある場合よりも、一緒にグループ化したい申し訳ありませんが十分ではない場合 – Mathieu

答えて

4

標準のANSI SQL文で探していることを行う方法はありません。ストアド・プロシージャについて上記で述べた、またはカーソルの使用を行うことができますが、カーソルを使用してT-SQLまたはPL/SQLに文を書いて、開始時間とカウントからそれぞれの数を判断することもできますT-SQL(マイクロソフトSQLサーバー):

USE [<database name here>] 
DECLARE @tbl_result TABLE (Result_DT DATETIME, Campaign VARCHAR(25), unit_count int); 
DECLARE @start_dt DATETIME, 
     @current_campaign VARCHAR(25), --This can be any length needed - if your campaigns are over 25 chars long 
     @record_dt DATETIME, 
     @campaign VARCHAR(25), 
     @cur_records CURSOR, 
     @Record_Count INT; 
SET @current_campaign = 'Start' 
SET @cur_records = CURSOR 
FOR SELECT DateTime, Campaign FROM myTable order by 1,2 

OPEN @cur_records 

FETCH NEXT FROM @cur_records INTO @record_dt, @campaign 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     -- CHECK THE record to the Current Campaign for grouping 
     IF @campaign <> @current_campaign 
      BEGIN 
       If @current_campaign <> 'Start' 
       BEGIN 
        INSERT INTO @tbl_result 
        VALUES (@start_dt, @current_campaign, @Record_Count) 
       END 
      SET @current_campaign = @campaign 
      SET @start_dt = @record_dt 
      SET @Record_Count = 1 
      END 
     ELSE 
      BEGIN 
       SET @Record_Count = @Record_Count + 1 
      END 
    END 
    INSERT INTO @tbl_result -- Inserting the last of the Records 
    VALUES (@start_dt, @current_campaign, @Record_Count) 
-- Now to display the results 
SELECT Result_DT, Campaign, unit_count FROM @tbl_result order by 1, 2 

今、このエラーアウトなら、私を許して - しかし、それはそれはマイクロソフトボックス

+0

Awsome、私はまだT-SQLを試していない、私はそれに入る時間だと思う!あなたの時間と貴重な助けをありがとう! – Mathieu

0

ので、同様にあなたは、キャンペーン、その後、日付でグループ化するように見える:

SELECT DateTime, Campaign, Count(Campaign) as Count 
FROM myTable 
GROUP BY DateTime, Campaign 
+1

これはうまくいかない - 私は彼がキャンペーンと日付ではなく、キャンペーンの継続的な実行を望んでいると思う。 – dfb

+0

DateTimeは決して同じではないので、何もグループ化しません。あなたの時間をありがとう! – Mathieu

2

これは、SQLで解決することはかなり難しいと他の方法で解決するのはとても簡単です問題です。私はこれが単一の生のSQLクエリで実行できるとは思わない。問題は、グループbyが個々の列のプロパティの集計ではなく、他の列にも依存していることです。あなたはカーソルを使ってsprocを書いたり、他の場所でプログラム的に実行する方が良いでしょう。

0

であれば、私はこのISNを知って何が必要かの基本的な構造でなければなりませんあなたが尋ねたことはありますが、「キャンペーン」列がユニークでない場合は、各キャンペーンに対して一意の識別子を持つ別の表(たとえば、自動インクリメントのデータ型)を追加します。この方法では、同じ名前のキャンペーンが2つあるかどうかは関係ありません。

FirstTable

UniqueCampaign  CampaignName 
1     Campaign1 
2     Campaign2 
3     Campaign1 

SecondTable

DateTime    UniqueCampaign  
2011-06-01 08:55:00 1 
2011-06-01 08:56:00 1 
2011-06-01 08:57:00 2 
2011-06-01 08:58:00 3 
2011-06-01 08:59:00 3 

次に、あなたが簡単にあなたに

DateTime     UniqueCampaign CampaignCount 
2011-06-01 08:55:00.000  1    2 
2011-06-01 08:57:00.000  2    1 
2011-06-01 08:58:00.000  3    2 
を与えるだろうどのような

SELECT MIN(DateTime) [DateTime], T1.UniqueCampaign, COUNT(*) CampaignCount 
FROM SecondTable T1 
INNER JOIN FirstTable T2 
    ON T1.UniqueCampaign = T2.UniqueCampaign 
Group By T1.UniqueCampaign 

でグループを使用することができます

+0

お返事ありがとうございました。一方、キャンペーン1は1つのキャンペーンに過ぎません。そうでなければ問題ありません! – Mathieu