2013-03-10 4 views
-2

Привет Я пытаюсь создать выбор, который будет отсчитывать пикапы из таблицы пикапов по месяцам. Select будет использоваться на веб-сайте, написанном на .NET.
отчет будет выглядеть следующим образом example pf report which i am trying to create select statement with count for months

У меня есть 3 таблицы

create table Agency 
    (
    AgencyID int not null IDENTITY, 
    AgencyName varchar (100)not null, 
    CeresNo VARCHAR(7), 
    AgencyCode varchar (16) not null, 
    Active bit,  
    CensusDist varchar(50) ,  
    GroupCode varchar (10),  
    Primary Key (AgencyID),  
    FOREIGN KEY (CensusDist) REFERENCES AgencyCensus(CensusDist),  
    FOREIGN KEY (GroupCode) REFERENCES AgencyGroup (GroupCode) 
    ); 

Клиенты стол

create table Clients 
    (
    ClientID int not null IDENTITY (9000,1), 
    AgencyID int not null, 
    AppDate date not null, 
    CertifiedDate date , 
    Primary Key (ClientID), 
    FOREIGN KEY (AgencyID) REFERENCES Agency(AgencyID), 
    ); 

и пикап стол

create table Pickup 

(
PickupID int IDENTITY, 
ClientID int , 
PickupDate date , 
PickupProxy varchar (200) , 
PickupHispanic bit default 0, 
EthnCode varchar(5) , 
CategCode varchar (2) , 
AgencyID int, 
Primary Key (PickupID), 
FOREIGN KEY (ClientID) REFERENCES Clients (ClientID) 
); 

так Пока я это заявление

select 
[Agency]= (select AgencyName from agency), 
[Jan] = (select count(pickupid) from pickup where PickupDate between '2012-01-01' and '2012-01-31' group by AgencyID), 
[FEB] = (select count(pickupid) from pickup where PickupDate between '2012-02-01' and '2012-02-29' group by AgencyID ) 

Выбрать, не закончена и, вероятно, должен быть переписан, но я не знаю, как :( это ошибки метание

Msg 512, Level 16, State 1, Line 1
Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

Также проблема заключается в том, что я не знаю, как сделать заявление посмотреть записи в таблице pickup с текущим годом. Потому что я думаю, что люди, которые будут использовать веб-сайт, не смогут изменить даты в select :) Также по какой-то причине функция AVG не вычисляет правильное среднее значение и не хочет делать это по группам. Пожалуйста помоги!

+0

Если вы создаете [SQLFiddle] (http://sqlfiddle.com) с некоторыми данными, например, вы, вероятно, получить ответы быстрее. –

+0

Я не могу понять, как это работает :) – Andrey

+0

SQLFiddle не понимаю :) нет даже страницы помощи :) – Andrey

ответ

-1
Alter procedure sp_CountPickups 
@MyYear int 
AS 
SELECT 
MAX(a.AgencyName), 
COUNT(PickupID) as YearTotal, 
COUNT(PickupID)/(CASE WHEN YEAR(GETDATE()) [email protected] THEN MONTH(GETDATE()) ELSE 12 END) as MoAvg, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 1 THEN 1 ELSE 0 end) as Jan, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 2 THEN 1 ELSE 0 end) as Feb, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 3 THEN 1 ELSE 0 end) as Mar, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 4 THEN 1 ELSE 0 end) as Apr, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 5 THEN 1 ELSE 0 end) as May, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 6 THEN 1 ELSE 0 end) as Jun, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 7 THEN 1 ELSE 0 end) as Jul, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 8 THEN 1 ELSE 0 end) as Aug, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 9 THEN 1 ELSE 0 end) as Sep, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 10 THEN 1 ELSE 0 end) as Oct, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 11 THEN 1 ELSE 0 end) as Nov, 
SUM(CASE WHEN DATEPART(month, PickupDate) = 12 THEN 1 ELSE 0 end) as Dec 
FROM dbo.Pickup p join Agency a on p.agencyid = a.agencyid 
where DATEPART(year, PickupDate) = @MyYear 
group by a.AgencyID 
order by a.AgencyID 

может быть будет полезно для кого-то

2

Вы не дали достаточно подробную информацию о том, как вы ожидаете, чтобы среднее быть calaculated, но остальные могут быть вычислены следующим образом:

SELECT 
    COUNT(PickupID) as YearTotal, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 1 THEN 1 ELSE 0 end) as Jan, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 2 THEN 1 ELSE 0 end) as Feb, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 3 THEN 1 ELSE 0 end) as Mar, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 4 THEN 1 ELSE 0 end) as Apr,    
    SUM(CASE WHEN DATEPART(month, PickupDate) = 5 THEN 1 ELSE 0 end) as May, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 6 THEN 1 ELSE 0 end) as Jun, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 7 THEN 1 ELSE 0 end) as Jul, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 8 THEN 1 ELSE 0 end) as Aug, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 9 THEN 1 ELSE 0 end) as Sep, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 10 THEN 1 ELSE 0 end) as Oct, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 11 THEN 1 ELSE 0 end) as Nov, 
    SUM(CASE WHEN DATEPART(month, PickupDate) = 12 THEN 1 ELSE 0 end) as Dec   
FROM dbo.Pickup 
where DATEPART(year, PickupDate) = 2012 
group by AgencyID 

Если год в вопросе (2012 здесь) поставляется в качестве параметра , Вам нужно будет либо выполнить поиск AgencyId в AgencyName по отчету ИЛИ использовать вышеуказанный запрос в таблице dervived и присоединить его к таблице Agency.

+0

Thanx! Насколько я понимаю, требования MoAVG это Yeartotal делится на 12 и округляет до самого полного числа. Также не было показано, как показать агентскую сеть, потому что эти две таблицы не имеют прямого отношения, которое они связывают друг с другом в таблице «Клиенты». Значит, мне нужно добавить 3 таблицы Join? – Andrey

+0

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

+0

Пиксельный стол имеет это поле 'AgencyID', но это не FOREIGN ключ, или я все еще могу подключить их к одному полю? Потому что в колледже они учат нас, мы должны присоединиться к таблице только с помощью FOREIGN или первичных ключей. – Andrey