我有一个返回一些行的查询。它的列名如下:Age,Gender,DOB等。 我要做的是,检查来自DB的年龄的行数。
e.g。见图:
查看年龄小计,这意味着我的查询返回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
答案 0 :(得分:3)
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
这个解决方案根本没有效率(我看到你需要计算许多其他小计)。最好保留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:在表中加载查询,然后对其运行各种小计查询。