将聚合组合成单个SQL表

时间:2010-08-13 09:05:20

标签: tsql

我们有一张表有点像这样:

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

它引用了另一个表格,其中YearEpisode的组合是唯一的,但我正在使用的这个表格列出了应用于每集的代码选择。

我要做的是创建一个表格,该表格返回每年的总集数和具有特定代码的剧集。我不能只做一个简单的“COUNT(*)”代码,因为一集可能会多次使用相同的代码。

任何人都可以看到一种可行的方式来做我正在尝试的事情吗?

2 个答案:

答案 0 :(得分:1)

这可能就是你所追求的。您至少需要SQL Server 2005才能使用数据透视功能。

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

答案 1 :(得分:0)

通过“创建表”,我将假设您知道如何从结果集创建表。因此,这会减少为:什么查询将返回每年剧集数的结果集。

您引用重复的元组是一个问题。你是对的,他们是个问题;他们为什么在那里? (2000, 1, 'A001')的一个元组与三个相同的元组之间的语义差异是什么?

DISTINCT子句旨在剥离那些;我建议您在不知道明确的理由在结果集中保留重复时使用它。

因此,如果重复项没有意义,并且结果集足以让您前进,那么:

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
对于具有指定代码的episode_code元组,

将按年份计算剧集数。

一旦你有了这个,我会调查你在episode_code中有重复的原因,并删除它们,除非你得到一个好的答案。