2011-06-12 5 views
3

Voici un problème que j'ai. Voici un exemple:Groupe SQL par numéro

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 

Je voudrais regrouper par campagne, mais seulement tant que c'est le même. Le résultat que je pense est:

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 

Chaque fois que je groupe sur la campagne, je reçois une seule ligne avec Campaign1

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

Résultats dans

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

Avez-vous une idée de comment je pourrais obtenir le résultat souhaité?

Merci!

+0

S'il vous plaît poster votre structure de tableau, il est difficile de déterminer ce que vous essayez de regrouper ici, sinon la colonne Campagne ... –

+0

Il s'agit de ces deux colonnes. La table est triée par DateTime. Je veux que le regroupement respecte l'ordre chronologique de la journée. Donc, il groupe Campaign1 jusqu'à ce qu'un Campaing2 soit rencontré. Puis il regroupe les campagnes2. Que s'il y a d'autres Campaign1, je veux qu'ils se regroupent, etc.Désolé si ce n'était pas assez clair – Mathieu

Répondre

4

Il n'y a pas moyen de faire ce que vous recherchez dans une instruction SQL ANSI standard. Ce qui a été dit plus haut sur une procédure stockée ou en utilisant des curseurs peut être fait - mais vous pouvez aussi écrire les instructions dans un T-SQL ou PL/SQL en utilisant des curseurs pour déterminer le nombre de début et de début. T-SQL (Microsoft serveur 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 

maintenant, pardonnez-moi si ces erreurs - mais il devrait être la structure de base de ce que vous avez besoin si elle est un Microsoft Box

+0

Super, je n'ai pas encore essayé T-SQL, je suppose qu'il est temps d'y entrer! Merci pour votre temps et votre aide précieuse! – Mathieu

0

Vous semblez vouloir groupe par date, puis la campagne, comme ceci:

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

Cela ne fonctionne pas tout à fait - je pense qu'il veut des séries continues de campagnes, pas de campagne et de date. – dfb

+0

Le DateTime n'est jamais le même, donc cela ne regrouperait rien. Merci pour votre temps si! – Mathieu

2

Ceci est un problème qui est assez difficile à résoudre dans SQL et vraiment facile à résoudre d'autres façons. Je ne pense même pas que cela peut être fait dans une seule requête SQL brute. Le problème est que le groupe par n'est pas un agrégat des propriétés des colonnes individuelles, mais dépend également d'autres colonnes. Il vaudrait mieux écrire un sproc avec un curseur ou le faire par programmation ailleurs.

0

Je sais que ce n » t ce que vous avez demandé, mais si la colonne "Campagne" n'est pas unique, j'ajouterais une autre table avec un identifiant unique pour chaque Campagne, par exemple un type de données auto-incrémenté. De cette façon, cela n'aurait pas d'importance si vous aviez deux campagnes portant le même nom.

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 

Ensuite, vous pouvez facilement utiliser simplement un groupe par comme

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

qui vous donnera

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 
+0

Merci pour votre réponse et votre temps. D'un autre côté, Campaign1 est une seule campagne. Sinon, ce n'est pas un problème! – Mathieu