Объединенные агрегаты в одну таблицу SQL - PullRequest
0 голосов
/ 13 августа 2010

У нас есть таблица, которая выглядит примерно так:

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

Он ссылается на другую таблицу, в которой комбинация Year и Episode уникальна, но в этой таблице, с которой я работаю, просто перечисляются коды, применяемые к каждому эпизоду.

То, что я пытаюсь сделать, - это создать таблицу, которая будет возвращать общее количество эпизодов и эпизодов, имеющих определенный код, за год. Я не могу просто выполнить «COUNT (*)» кода, потому что один эпизод может иметь один и тот же код несколько раз.

Может кто-нибудь увидеть жизнеспособный способ сделать то, что я пытаюсь?

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Это может быть то, что вы после. Вам нужен как минимум 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

0 голосов
/ 04 января 2016

Под «созданием таблицы» я предполагаю, что вы знаете, как создать таблицу из набора результатов.Таким образом, это сводится к следующему: Какой запрос вернет набор результатов с количеством эпизодов за год .

В качестве проблемы вы приводите повторяющиеся кортежи.Вы правы, они проблема;почему они там?Какова семантическая разница между одним набором (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 и вообще удалите их, если вы не получите хороший ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...