Вычисление промежуточных итогов из запроса SQL - PullRequest
1 голос
/ 06 июня 2011

У меня есть запрос, который возвращает несколько строк.Названия его столбцов выглядят следующим образом: Age, Gender, DOB и т. Д. Мне нужно проверить, сколько строк поступает из БД какого возраста.

например. См. Изображение:

enter image description here

См. Промежуточный итог по возрасту, это означает, что мой запрос возвращает 54 строки по возрасту 0, 1 строку по возрасту 1 и т. Д.

Эта таблица промежуточных итогов должна отображать только эти возрастыкоторые возвращаются запросом.Например, возраст 2 не существует, так как он не был возвращен запросом.

Как мне решить эту проблему, если у кого-то есть идея, пожалуйста, поделитесь.Любая помощь будет высоко оценена.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Вот моя хранимая процедура:

ALTER PROCEDURE [dbo].[spGetClients]
(
    @orderBy varchar(50),
    @startAge int,
    @endAge int,
    @sex varchar(5),
    @developmentalDisability varchar(200),
    @staffId nvarchar(1024), 
    @statusId nvarchar(1024), 
    @ethnicityId nvarchar(1024), 
    @treatmentProviderId nvarchar(1024)
)

AS
BEGIN
    SET NOCOUNT ON;

        SELECT c.Id, dbo.GetClientFullName(c.FirstName, c.MiddleInit, c.LastName) AS ClientName, 
        c.DateOfBirth, dbo.GetAge(c.DateOfBirth, GETDATE()) AS Age, c.Sex, 
        dbo.GetClientStatus(c.Id, @statusId) AS Status, ca.Address, co.Phone, 
        dbo.GetEthnicity(c.Id, @ethnicityId) AS Ethnicity, dbo.GetDevelopmentalDisabilities(c.Id, @developmentalDisability) AS Disabilities, 
        dbo.GetClientStaffContacts(c.Id, @staffId) AS Staff, dbo.GetClientContacts(c.Id) AS Contact, 
        dbo.GetClientInsuranceProviders(c.Id) AS HealthProvider, 
        dbo.GetClientTreatmentProviders(c.Id, @treatmentProviderId) AS TreatmentProvider
        FROM Client c  
        LEFT OUTER JOIN(        
            SELECT ca.ParentEntityId, ca.Address
            FROM ContactAddress ca
            INNER JOIN EntityName en ON en.Id = ca.EntityNameId AND en.Name = 'Client' 
            INNER JOIN GeneralLookup gl ON ca.glAddressTypeId = gl.Id AND gl.LookupItem = 'Primary'    
        ) ca ON c.Id = ca.ParentEntityId 
        LEFT OUTER JOIN(        
            SELECT co.ParentEntityId, co.ContactData Phone
            FROM ContactOther co
            INNER JOIN EntityName en ON en.Id = co.EntityNameId AND en.Name = 'Client' 
            INNER JOIN GeneralLookup gl ON co.glContactTypeId = gl.Id AND gl.LookupItem = 'Home'    
        ) co ON c.Id = co.ParentEntityId 
        LEFT OUTER JOIN GeneralStatus gs on gs.Id = c.StatusId
        where gs.Name <> 'Deleted' 
        and (dbo.GetAge(c.DateOfBirth, GETDATE()) BETWEEN @startAge and @endAge)
        and ((@sex = 'M' and c.sex = 'M') or (@sex = 'F' and c.Sex = 'F') or (@sex = 'Both' and (c.Sex in ('M', 'F', ''))))
        and ((@staffId = '') OR (dbo.GetClientStaffContacts(c.Id, @staffId) is not null))
        and ((@statusId = '') OR (dbo.GetClientStatus(c.Id, @statusId) is not null))
        and ((@ethnicityId = '') OR (dbo.GetEthnicity(c.Id, @ethnicityId) is not null))
        and ((@treatmentProviderId = '') OR (dbo.GetClientTreatmentProviders(c.Id, @treatmentProviderId) is not null))
        ORDER BY 
            CASE
                WHEN @orderBy = 'Consumer Name' THEN dbo.GetClientFullName(c.FirstName, c.MiddleInit, c.LastName) 
                WHEN @orderBy = 'Consumer Address' THEN ca.Address
            END
END

Ответы [ 3 ]

3 голосов
/ 06 июня 2011
SELECT Age, count(Age) SubTotals
  FROM (sub query)
 GROUP BY Age

с группировкой по Age, запрос покажет Age и count(Age) = количество строк с таким возрастом

Обновление:

Вы можете сделать это:

SELECT T.*, TA.Age_SubTotals
FROM (YOUR QUERY) T
JOIN (SELECT dbo.GetAge(c.DateOfBirth, GETDATE()) AS Age, count(*) Age_SubTotals
        FROM Client c
       GROUP BY Age) TA
     ON T.Age = TA.Age

Это решение вообще неэффективно (и я вижу, что вам нужно будет вычислить много других промежуточных итогов). Лучше оставить процесс как есть и подсчитать промежуточные итоги в вашем клиентском приложении.

0 голосов
/ 06 июня 2011

Ваш запрос довольно сложный, и результат, похоже, предназначен для отчета, не могли бы вы просто уточнить свой итог в отчете?(SSRS Учебное пособие для групп и итогов)

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

0 голосов
/ 06 июня 2011

Не зная, что твое будущее будет чем-то вроде

SELECT count(age),age FROM `table` WHERE count(age) > 0 GROUP BY age ORDER BY age ASC
...