2010-08-13 7 views
0

Nous avons une table qui est un peu comme ceci:agrégats combinés en une seule table SQL

Year Episode Code 
2000  1 A001 
2000  1 A001 
2000  1 C007 
2000  2 A001 
2000  2 B001 

Il est basé sur un autre tableau, dans lequel la combinaison de Year et Episode est unique, mais ce tableau je suis Travailler avec seulement listes la sélection des codes appliqués à chaque épisode.

Ce que j'essaie de faire est de créer une table qui retourne un nombre par an du nombre total d'épisodes et d'épisodes qui ont un code particulier. Je ne peux pas faire un simple "COUNT (*)" du code, car un épisode peut avoir le même code plusieurs fois. Est-ce que n'importe qui peut voir une manière viable de faire ce que j'essaye?

Répondre

1

Cela pourrait être ce que vous cherchez. Vous avez besoin au moins de SQL Server 2005 pour la fonction pivot.

create table MyTable (
    [Year] datetime, 
    Episode int, 
    Code nvarchar(20) 
) 

insert into MyTable values ('01-01-2000', 1, 'A001') 
insert into MyTable values ('01-01-2000', 1, 'A001') 
insert into MyTable values ('01-01-2000', 1, 'C007') 
insert into MyTable values ('01-01-2000', 2, 'A001') 
insert into MyTable values ('01-01-2000', 2, 'B001') 
insert into MyTable values ('01-01-2000', 2, 'B001') 
insert into MyTable values ('01-01-2001', 1, 'A001') 
insert into MyTable values ('01-01-2002', 1, 'A001') 
insert into MyTable values ('01-01-2003', 1, 'C007') 

select [Code], [2000], [2001], [2002] 
from (
     select Code,  
     DATEPART(year, [Year]) as date, 
     count(Episode) as instances 
     from MyTable 
     group by DATEPART(year, [year]), code) as o 
pivot 
(
    sum(instances) for date in ([2000], [2001], [2002]) 
) as p 

alt text

0

Par « créer une table » Je vais supposer que vous savez comment créer une table à partir d'un jeu de résultats. Donc, cela réduit à: Quelle requête retournera un ensemble de résultats avec un nombre par an d'épisodes.

Vous indiquez que les tuples en double sont un problème. Vous avez raison, ils sont un problème; pourquoi sont-ils là? Quelle est la différence sémantique entre un tuple de (2000, 1, 'A001') et trois identiques? La clause DISTINCT est conçue pour enlever ces éléments; Je recommande de l'utiliser chaque fois que vous ne connaissez pas une bonne raison explicite de conserver les doublons dans le jeu de résultats.

Donc, si les doublons ne sont pas significatifs, et un jeu de résultats est suffisant pour vous de progresser, alors:

SELECT DISTINCT 
    year, 
    COUNT(episode) AS episode_count 
FROM (
    SELECT DISTINCT 
     year, 
     episode 
    FROM episode_code 
    WHERE 
     code = 'A001' 
    ) AS episode_for_code 
GROUP BY year 

donnera un nombre d'épisodes par année, pour episode_code avec un code tuples spécifié.

Une fois que vous avez cela, j'explorerais pourquoi vous avez des doublons dans episode_code et les supprimer à moins d'avoir une bonne réponse.

Questions connexes