Сводный запрос кросс-таблицы SQL - PullRequest
2 голосов
/ 22 марта 2012

У меня есть таблица, как показано ниже.

CaseID   StatusID    StageID     CaseRegisterTime   City
1        1            5            datetime         XYZ
2        1            5            datetime         ABC

Теперь я хочу, чтобы он рассчитывал Citywise и только для определенных дат, а также в состоянии для statusid = 1 и stageid = 5.

Cities     CurrentDate-1    CurrentDate-2   January2012-CurrentDate-3
XYZ           5                  51                  5008
JUS           0                   0                   125
ABC           1                   0                   48

Я хочу, чтобы мой заголовок группировал дела для CaseRegisterTime, как показано выше.

Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 22 марта 2012

Вот один из многих способов сделать это в SQL Server 2008 (используя тип данных Date):

select distinct a.City as Cities
    , (select count(*)
        from MyTable
        where CaseRegisterTime >= cast(getdate() - 1 as date)
            and CaseRegisterTime < cast(getdate() - 0 as date)
            and StatusID = a.StatusID
            and StageID = a.StageID
            and City = a.City
    ) as [CurrentDate-1]
    , (select count(*)
        from MyTable
        where CaseRegisterTime >= cast(getdate() - 2 as date)
            and CaseRegisterTime < cast(getdate() - 1 as date)
            and StatusID = a.StatusID
            and StageID = a.StageID
            and City = a.City
    ) as [CurrentDate-2]
    , (select count(*)
        from MyTable
        where CaseRegisterTime >= cast('20120101' as date)
            and CaseRegisterTime < cast(getdate() - 2 as date)
            and StatusID = a.StatusID
            and StageID = a.StageID
            and City = a.City
    ) as [January2012-CurrentDate-3]
from MyTable a
where a.StatusID = 1
    and a.StageID = 5

Обновление

Метод case и sum @JotaBe использует примерно в два раза быстрее на моем боксе (с гораздо меньшим количеством операций сканирования и чтения), так что вот как это может выглядеть:

select a.City as Cities
    , sum(a.[CurrentDate-1]) as [CurrentDate-1]
    , sum(a.[CurrentDate-2]) as [CurrentDate-2]
    , sum(a.[January2012-CurrentDate-3]) as [January2012-CurrentDate-3]
from (
    select City
        , case when CaseRegisterTime >= cast(getdate() - 1 as date)
                and CaseRegisterTime < cast(getdate() - 0 as date)
                then 1 else 0 end [CurrentDate-1]
        , case when CaseRegisterTime >= cast(getdate() - 2 as date)
                and CaseRegisterTime < cast(getdate() - 1 as date)
                then 1 else 0 end [CurrentDate-2]
        , case when CaseRegisterTime >= cast('20120101' as date)
                and CaseRegisterTime < cast(getdate() - 2 as date)
                then 1 else 0 end [January2012-CurrentDate-3]
    from MyTable 
    where StatusID = 1
        and StageID = 5
) as a
group by a.City
0 голосов
/ 22 марта 2012

Примерно так будет:

begin tran;
go
create table #t1(
    ID int identity,
    City varchar,
    RegisterDate  datetime
);
declare  @firstDate datetime, @secondDate datetime;
 set @firstDate = '2012-1-1';
 set @secondDate = '2012-1-2';
insert into #t1 values
    ('A', @firstDate),
    ('A', @firstDate),
    ('B', @firstDate),
    ('B', @firstDate),
    ('B', @firstDate),
    ('A', @secondDate),
    ('A', @secondDate),
    ('A', @secondDate),
    ('B', @secondDate),
    ('B', @secondDate);

select * from #t1;

select pvt.*
from(
    select ID, City, RegisterDate
    from #t1
) a
pivot(
    count(a.ID)
    for a.RegisterDate in ([2012-1-1], [2012-1-2])
)   as pvt;

drop table #t1;
go
rollback tran;
0 голосов
/ 22 марта 2012

Используйте case when, чтобы преобразовать интересующие вас даты в 'CurrentDate-1' и 'CurrentDate-2', а затем поверните результаты, используя эти строки в качестве новых столбцов.

В качестве альтернативы, вы можете сделать что-то вроде этого:

select City, sum(Date1) as Date1, sum(Date2) as Date2
from(
select City, 
    case when CaseRegisterTime='2012-01-01' then 1 else 0 end as Date1,
    case when  CaseRegisterTime='2012-15-01' then 1 else 0 end as Date2
from sample
) as T
group by City

Вы также должны отфильтровать регистры, которые не имеют желаемой даты.

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