1

我有一个返回一些行的查询。它的列名是这样的:年龄,性别,出生日期等。我要做的是,检查有多少行来自哪个年龄的数据库。

例如看图:

在此处输入图像描述

查看年龄小计,这意味着我的查询返回 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
4

3 回答 3

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 并在您的客户端应用程序中计算小计。

于 2011-06-06T09:24:26.477 回答
0

在不知道你的结构将是这样的情况下

SELECT count(age),age FROM `table` WHERE count(age) > 0 GROUP BY age ORDER BY age ASC
于 2011-06-06T09:25:33.837 回答
0

您的查询非常详细,并且输出似乎是针对报告的,您不能在报告中详细说明您的小计吗?(组和总计的SSRS教程)

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

于 2011-06-06T09:47:39.217 回答