2011-05-06 1 views
1

j'ai eu une table comme ceci:SQL Comment grouper des données par 2 colonnes de date différentes?

Id  Date1   Date2  Status 
    ---------------------------------------------- 
    1 01/01/2010  null   A 
    2 04/04/2010  05/14/10 X 
    3 01/01/2010  null   A 
    4 01/11/2010  01/01/2010 X 
    5 01/02/2010  null   A 

Et plusieurs autres documents, Date 1 n'est pas nul mais il est pertinent que dans le groupe par si le statut est A, pour les enregistrements où Date2 est non nul, quel que soit le statut du groupe par doit être par cette Date2.

Le jeu de résultat souhaité est la suivante:

Date    Number of A Status  Number of Date 2 not null statuses 
------------------------------------------------------------------------------ 
01//01/2010   2          1 
01/02/2010    1          0 
05/14/2010    0          1 

Fondamentalement, le groupe du moût groupe par date, le problème est que, dans certains cas, il est pour la colonne Date1 et dans l'autre cas est la Date2 colonnes. Comment cela peut-il être accompli?

+0

Ceci est pour Oracle, mais devrait être le même pour SQL –

+0

Qu'est-ce que vous pensez est pas toujours le case - SQL signifie "Structured Query Language" et non "Standardized". Bien que ANSI améliore cela, la fonctionnalité ANSI ne fonctionne pas nécessairement aussi vite que la syntaxe native. –

Répondre

2

Vous pouvez regrouper par un décodage, ou le cas, l'expression. Seulement essayé dans Oracle, donc je ne sais pas si c'est portable. Grâce à ces données:

create table t42 as 
select 1 id, to_date('01/01/2010') date1, null date2, 'A' status from dual 
union select 2, to_date('04/04/2010'), to_date('05/14/2010'), 'X' from dual 
union select 3, to_date('01/01/2010'), null, 'A' from dual 
union select 4, to_date('01/11/2010'), to_date('01/01/2010'), 'X' from dual 
union select 5, to_date('01/02/2010'), null, 'A' from dual 
/

select * from t42; 

ID      DATE1      DATE2      STATUS 
---------------------- ------------------------- ------------------------- ------ 
1      01/01/2010           A  
2      04/04/2010    05/14/2010    X  
3      01/01/2010           A  
4      01/11/2010    01/01/2010    X  
5      01/02/2010           A 

Vous pouvez faire:

select case when date2 is null and status = 'A' then date1 
     else date2 end as "Date", 
    sum(case when status = 'A' then 1 else 0 end) as "Number of A status", 
    sum(case when date2 is null then 0 else 1 end) as "Number of Date 2 null" 
from t42 
group by case when date2 is null and status = 'A' then date1 else date2 end 
order by 1; 

Ce qui donne:

Date      Number of A status  Number of Date 2 null 
------------------------- ---------------------- ---------------------- 
01/01/2010    2      1      
01/02/2010    1      0      
05/14/2010    0      1 
1

Il est une question PIVOT typique:

SELECT x.date, 
      SUM(CASE WHEN 'A' IN (y.status, z.status) THEN 1 ELSE 0 END) AS NumStatusA, 
      SUM(CASE 
       WHEN y.date2 IS NOT NULL OR z.date2 IS NOT NULL THEN 1 
       ELSE 0 
       END) AS NumDate2NotNull 
    FROM (SELECT a.date1 AS date 
      FROM YOUR_TABLE a 
      UNION 
      SELECT b.date2 AS date 
      FROM YOUR_TABLE b) x 
LEFT JOIN YOUR_TABLE y ON y.date1 = x.date 
LEFT JOIN YOUR_TABLE z ON z.date1 = x.date 
GROUP BY x.date 

Mais vous devez obtenir une table contenant les dates des deux colonnes, en fonction de vos données, pour rejoindre contre le premier.

+1

Cela ne se regroupe que par date1. Il demande comment regrouper par 2 colonnes de date différentes. –

+0

Avez-vous besoin de réparer l'UNION - il devrait être sélectionné à partir de date1 ou date2 selon, ne devrait-il pas? –

+0

@Jonathan Leffler: Thx, copier/coller typo corrigé –

0

Peut-être quelque chose comme ceci:

SELECT DISTINCT Date1 as Date, 
(SELECT COUNT(*) FROM MyTable WHERE DATE1=MyT.Date1 AND Status = 'A') NumberAStatus, 
(SELECT COUNT(*) FROM MyTable WHERE DATE1=MyT.Date1 AND Date2 is not null) NotNullDate2 

FROM MyTable MyT 
+1

Ce groupe est uniquement composé de Date1 - il veut regrouper Date1 et Date2. –

Questions connexes