从SQL查询计算小计

时间:2011-06-06 09:18:19

标签: sql-server-2008 subtotal

我有一个返回一些行的查询。它的列名如下:Age,Gender,DOB等。 我要做的是,检查来自DB的年龄的行数。

e.g。见图:

enter image description here

查看年龄小计,这意味着我的查询返回54行0岁,1行1岁,依此类推。

此小计表必须仅显示查询返回的年龄。例如,没有Age 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 个答案:

答案 0 :(得分:3)

SELECT Age, count(Age) SubTotals
  FROM (sub query)
 GROUP BY Age

Age分组,查询将显示Agecount(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

这个解决方案根本没有效率(我看到你需要计算许多其他小计)。最好保留proc原样并在客户端应用程序中计算小计。

答案 1 :(得分:0)

不知道你的结构会像

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

答案 2 :(得分:0)

您的查询非常精细,输出似乎是针对报告的,您难道不能在报告中详细说明您的小计吗? (群组和总计的SSRS Tutorial

如果不可能,我认为您可以修改存储过程以使用Table Variable:在表中加载查询,然后对其运行各种小计查询。