我有一个SQL Server 2012函数,如下所示:
ALTER FUNCTION [dbo].[udf_Querytest2]
(@UnitId INT, @UserId INT, @PublishedPageTypeId INT, @dir Char(4))
RETURNS TABLE
AS RETURN
(
SELECT *
FROM
(
SELECT *, ROW_NUMBER() OVER (ORDER BY
CASE
WHEN @dir = 'ASC' THEN [Date]
END
ASC,
CASE
WHEN @dir = 'DESC' THEN [Date]
END
DESC
) AS row
FROM
(
SELECT
PublishedPage.PublishedPageId,
PublishedPage.PublishedPageTypeId,
PublishedPage.UnitId,
PublishedPage.UserId,
PublishedPage.VenueId,
PublishedPage.ImageReference,
ISNULL (PublishedPage.DateFrom,PublishedPage.CreatedOn) AS [Date],
PublishedPage.DateFrom,
PublishedPage.DateTo,
PublishedPage.TimeStart,
PublishedPage.VenueOther,
PublishedPage.LinkURL,
PublishedPageDistribution.Status,
(
SELECT
CASE WHEN EXISTS
(
SELECT
UserPublishedPageHistoryId
FROM
UserPublishedPageHistory
WHERE
(
(UserId = @UserId) AND
(UserPublishedPageHistory.PublishedPageId = PublishedPage.PublishedPageId)
)
)
THEN 1 --'User Read'
ELSE 0 --'User Unread'
END
) AS ItemRead,
PublishedPage.CreatedOn,
PublishedPage.ModifiedOn
FROM
PublishedPage
INNER JOIN
Unit AS UnitParent ON PublishedPage.UnitId = UnitParent.UnitId
INNER JOIN
UnitHierarchy ON UnitParent.UnitId = UnitHierarchy.ParentId
INNER JOIN
Unit AS UnitChild ON UnitHierarchy.ChildId = UnitChild.UnitId
INNER JOIN
UnitType ON UnitType.UnitTypeId = UnitParent.UnitTypeId
INNER JOIN
UnitRoleUser ON UnitChild.UnitId = UnitRoleUser.UnitId
INNER JOIN
PublishedPageDistribution ON PublishedPageDistribution.PublishedPageId = PublishedPage.PublishedPageId
INNER JOIN
Distribution ON Distribution.DistributionId = PublishedPageDistribution.DistributionId
WHERE
(
(PublishedPage.UnitId = @UnitId) AND
(UnitRoleUser.UserId = @UserId) AND
(UnitRoleUser.Active = 1) AND
(UnitType.UnitTypeId = 2) AND
(PublishedPageDistribution.DistributionId IN(4)) AND
(PublishedPageDistribution.Status = 1) AND
(PublishedPage.PublishedPageTypeId = @PublishedPageTypeId) AND
(PublishedPage.Active = 1)
)
UNION
SELECT
PublishedPage.PublishedPageId,
PublishedPage.PublishedPageTypeId,
PublishedPage.UnitId,
PublishedPage.UserId,
PublishedPage.VenueId,
PublishedPage.ImageReference,
ISNULL (PublishedPage.DateFrom,PublishedPage.CreatedOn) AS [Date],
PublishedPage.DateFrom,
PublishedPage.DateTo,
PublishedPage.TimeStart,
PublishedPage.VenueOther,
PublishedPage.LinkURL,
PublishedPageDistribution.Status,
(
SELECT
CASE WHEN EXISTS
(
SELECT
UserPublishedPageHistoryId
FROM
UserPublishedPageHistory
WHERE
(
(UserId = @UserId) AND
(UserPublishedPageHistory.PublishedPageId = PublishedPage.PublishedPageId)
)
)
THEN 1 --'User Read'
ELSE 0 --'User Unread'
END
) AS ItemRead,
PublishedPage.CreatedOn,
PublishedPage.ModifiedOn
FROM
PublishedPage
INNER JOIN
Unit AS UnitParent ON PublishedPage.UnitId = UnitParent.UnitId
INNER JOIN
UnitHierarchy ON UnitParent.UnitId = UnitHierarchy.ParentId
INNER JOIN
Unit AS UnitChild ON UnitHierarchy.ChildId = UnitChild.UnitId
INNER JOIN
UnitType ON UnitType.UnitTypeId = UnitParent.UnitTypeId
INNER JOIN
UnitRoleUser ON UnitChild.UnitId = UnitRoleUser.UnitId
INNER JOIN
PublishedPageDistribution ON PublishedPageDistribution.PublishedPageId = PublishedPage.PublishedPageId
INNER JOIN
Distribution ON Distribution.DistributionId = PublishedPageDistribution.DistributionId
WHERE
(
(PublishedPage.UnitId = @UnitId) AND
(UnitRoleUser.UserId = @UserId) AND
(UnitRoleUser.Active = 1) AND
(UnitType.UnitTypeId = 2) AND
(PublishedPageDistribution.DistributionId IN(1)) AND
(PublishedPageDistribution.Status = 1) AND
(PublishedPage.PublishedPageTypeId = @PublishedPageTypeId) AND
(PublishedPage.Active = 1)
)
UNION
SELECT
PublishedPage.PublishedPageId,
PublishedPage.PublishedPageTypeId,
PublishedPage.UnitId,
PublishedPage.UserId,
PublishedPage.VenueId,
PublishedPage.ImageReference,
ISNULL (PublishedPage.DateFrom,PublishedPage.CreatedOn) AS [Date],
PublishedPage.DateFrom,
PublishedPage.DateTo,
PublishedPage.TimeStart,
PublishedPage.VenueOther,
PublishedPage.LinkURL,
PublishedPageDistribution.Status,
(
SELECT
CASE WHEN EXISTS
(
SELECT
UserPublishedPageHistoryId
FROM
UserPublishedPageHistory
WHERE
(
(UserId = @UserId) AND
(UserPublishedPageHistory.PublishedPageId = PublishedPage.PublishedPageId)
)
)
THEN 1 --'User Read'
ELSE 0 --'User Unread'
END
) AS ItemRead,
PublishedPage.CreatedOn,
PublishedPage.ModifiedOn
FROM
PublishedPage
INNER JOIN
Unit AS UnitChild ON PublishedPage.UnitId = UnitChild.UnitId
INNER JOIN
UnitHierarchy as UH1 ON UnitChild.UnitId = UH1.ChildId
INNER JOIN
Unit AS UnitParent ON PublishedPage.UnitId = UnitParent.UnitId
INNER JOIN
UnitHierarchy as UH2 ON UnitChild.UnitId = UH2.ChildId
INNER JOIN
Unit AS UnitChildren ON UH2.ChildId = UnitChild.UnitId
INNER JOIN
UnitType ON UnitType.UnitTypeId = UnitChildren.UnitTypeId
INNER JOIN
PublishedPageDistribution ON PublishedPageDistribution.PublishedPageId = PublishedPage.PublishedPageId
INNER JOIN
Distribution ON Distribution.DistributionId = PublishedPageDistribution.DistributionId
WHERE
(
(PublishedPage.UnitId = @UnitId) AND
(UnitType.UnitTypeId = 3) AND
(PublishedPageDistribution.DistributionId IN(5)) AND
(PublishedPageDistribution.Status = 1) AND
(PublishedPage.PublishedPageTypeId = @PublishedPageTypeId) AND
(PublishedPage.Active = 1)
)
UNION
SELECT
PublishedPage.PublishedPageId,
PublishedPage.PublishedPageTypeId,
PublishedPage.UnitId,
PublishedPage.UserId,
PublishedPage.VenueId,
PublishedPage.ImageReference,
ISNULL (PublishedPage.DateFrom,PublishedPage.CreatedOn) AS [Date],
PublishedPage.DateFrom,
PublishedPage.DateTo,
PublishedPage.TimeStart,
PublishedPage.VenueOther,
PublishedPage.LinkURL,
PublishedPageDistribution.Status,
(
SELECT
CASE WHEN EXISTS
(
SELECT
UserPublishedPageHistoryId
FROM
UserPublishedPageHistory
WHERE
(
(UserId = @UserId) AND
(UserPublishedPageHistory.PublishedPageId = PublishedPage.PublishedPageId)
)
)
THEN 1 --'User Read'
ELSE 0 --'User Unread'
END
) AS ItemRead,
PublishedPage.CreatedOn,
PublishedPage.ModifiedOn
FROM
PublishedPage
INNER JOIN
Unit ON PublishedPage.UnitId = Unit.UnitId
INNER JOIN
UnitType ON Unit.UnitTypeId = UnitType.UnitTypeId
INNER JOIN
UnitRoleUser ON Unit.UnitId = UnitRoleUser.UnitId
INNER JOIN
PublishedPageDistribution ON PublishedPageDistribution.PublishedPageId = PublishedPage.PublishedPageId
INNER JOIN
Distribution ON Distribution.DistributionId = PublishedPageDistribution.DistributionId
WHERE
(
(Unit.UnitId = @UnitId) AND
(UnitRoleUser.UserId = @UserId) AND
(UnitRoleUser.Active = 1) AND
(UnitType.UnitTypeId = 3) AND
(PublishedPageDistribution.DistributionId IN(3)) AND
(PublishedPageDistribution.Status = 1) AND
(PublishedPage.PublishedPageTypeId = @PublishedPageTypeId) AND
(PublishedPage.Active = 1)
)
UNION
SELECT
PublishedPage.PublishedPageId,
PublishedPage.PublishedPageTypeId,
PublishedPage.UnitId,
PublishedPage.UserId,
PublishedPage.VenueId,
PublishedPage.ImageReference,
ISNULL (PublishedPage.DateFrom,PublishedPage.CreatedOn) AS [Date],
PublishedPage.DateFrom,
PublishedPage.DateTo,
PublishedPage.TimeStart,
PublishedPage.VenueOther,
PublishedPage.LinkURL,
PublishedPageDistribution.Status,
(
SELECT
CASE WHEN EXISTS
(
SELECT
UserPublishedPageHistoryId
FROM
UserPublishedPageHistory
WHERE
(
(UserId = @UserId) AND
(UserPublishedPageHistory.PublishedPageId = PublishedPage.PublishedPageId)
)
)
THEN 1 --'User Read'
ELSE 0 --'User Unread'
END
) AS ItemRead,
PublishedPage.CreatedOn,
PublishedPage.ModifiedOn
FROM
UnitRoleUser
INNER JOIN
Unit AS UnitParent ON UnitRoleUser.UnitId = UnitParent.UnitId
INNER JOIN
Unit AS UnitChild ON UnitParent.VenueId = UnitChild.VenueId
INNER JOIN
PublishedPage ON UnitChild.UnitId = PublishedPage.UnitId
INNER JOIN
PublishedPageDistribution ON PublishedPageDistribution.PublishedPageId = PublishedPage.PublishedPageId
INNER JOIN
Distribution ON Distribution.DistributionId = PublishedPageDistribution.DistributionId
WHERE
(
(UnitParent.UnitId = @UnitId) AND
(UnitRoleUser.UserId = @UserId) AND
(UnitRoleUser.Active = 1) AND
(UnitParent.UnitTypeId = 3) AND
(PublishedPageDistribution.DistributionId IN(2)) AND
(PublishedPageDistribution.Status = 1) AND
(PublishedPage.PublishedPageTypeId = @PublishedPageTypeId) AND
(PublishedPage.Active = 1)
)
UNION
SELECT
PublishedPage.PublishedPageId,
PublishedPage.PublishedPageTypeId,
PublishedPage.UnitId,
PublishedPage.UserId,
PublishedPage.VenueId,
PublishedPage.ImageReference,
ISNULL (PublishedPage.DateFrom,PublishedPage.CreatedOn) AS [Date],
PublishedPage.DateFrom,
PublishedPage.DateTo,
PublishedPage.TimeStart,
PublishedPage.VenueOther,
PublishedPage.LinkURL,
PublishedPageDistribution.Status,
(
SELECT
CASE WHEN EXISTS
(
SELECT
UserPublishedPageHistoryId
FROM
UserPublishedPageHistory
WHERE
(
(UserId = @UserId) AND
(UserPublishedPageHistory.PublishedPageId = PublishedPage.PublishedPageId)
)
)
THEN 1 --'User Read'
ELSE 0 --'User Unread'
END
) AS ItemRead,
PublishedPage.CreatedOn,
PublishedPage.ModifiedOn
FROM
UnitRoleUser
INNER JOIN
UnitHierarchy as UH1 ON UnitRoleUser.UnitId = UH1.ChildId
INNER JOIN
UnitHierarchy as UH2 ON UH1.ParentId = UH2.ParentId
INNER JOIN
Unit ON UH2.ChildId = Unit.UnitId
INNER JOIN
PublishedPage ON Unit.UnitId = PublishedPage.UnitId
INNER JOIN
PublishedPageDistribution ON PublishedPageDistribution.PublishedPageId = PublishedPage.PublishedPageId
INNER JOIN
Distribution ON Distribution.DistributionId = PublishedPageDistribution.DistributionId
WHERE
(
(UnitRoleUser.UnitId = @UnitId) AND
(UnitRoleUser.UserId = @UserId) AND
(UnitRoleUser.Active = 1) AND
(Unit.UnitTypeId = 3) AND
(PublishedPageDistribution.DistributionId IN(7)) AND
(PublishedPageDistribution.Status = 1) AND
(PublishedPage.PublishedPageTypeId = @PublishedPageTypeId) AND
(PublishedPage.Active = 1)
)
UNION
SELECT
PublishedPage.PublishedPageId,
PublishedPage.PublishedPageTypeId,
PublishedPage.UnitId,
PublishedPage.UserId,
PublishedPage.VenueId,
PublishedPage.ImageReference,
ISNULL (PublishedPage.DateFrom,PublishedPage.CreatedOn) AS [Date],
PublishedPage.DateFrom,
PublishedPage.DateTo,
PublishedPage.TimeStart,
PublishedPage.VenueOther,
PublishedPage.LinkURL,
PublishedPageDistribution.Status,
(
SELECT
CASE WHEN EXISTS
(
SELECT
UserPublishedPageHistoryId
FROM
UserPublishedPageHistory
WHERE
(
(UserId = @UserId) AND
(UserPublishedPageHistory.PublishedPageId = PublishedPage.PublishedPageId)
)
)
THEN 1 --'User Read'
ELSE 0 --'User Unread'
END
) AS ItemRead,
PublishedPage.CreatedOn,
PublishedPage.ModifiedOn
FROM
UnitRoleUser
INNER JOIN
UnitHierarchy as UH1 ON UnitRoleUser.UnitId = UH1.ChildId
INNER JOIN
UnitHierarchy as UH2 ON UH1.ParentId = UH2.ParentId
INNER JOIN
Unit ON UH2.ChildId = Unit.UnitId
INNER JOIN
PublishedPage ON Unit.UnitId = PublishedPage.UnitId
INNER JOIN
PublishedPageDistribution ON PublishedPageDistribution.PublishedPageId = PublishedPage.PublishedPageId
INNER JOIN
Distribution ON Distribution.DistributionId = PublishedPageDistribution.DistributionId
WHERE
(
(UnitRoleUser.UnitId = @UnitId) AND
(UnitRoleUser.UserId = @UserId) AND
(UnitRoleUser.Active = 1) AND
(Unit.UnitTypeId = 2) AND
(PublishedPageDistribution.DistributionId IN(6)) AND
(PublishedPageDistribution.Status = 1) AND
(PublishedPage.PublishedPageTypeId = @PublishedPageTypeId) AND
(PublishedPage.Active = 1)
)
) a
) b
WHERE
(
(
(@PublishedPageTypeId = 1) AND
(b.Date >= DATEADD(month, -3, GETDATE()))
) OR
(
(@PublishedPageTypeId = 2) AND
(b.Date >= DATEADD(week, -1, GETDATE()))
)
)
)
该功能基本上根据用户标准搜索Web内容的数据库。功能很好。
此处显示了输出样本Results.jpg
我的问题是:正如您从结果中看到的,我能够看到用户是否在ItemRead
列中读取了某个项目。
如何修改此SQL函数以允许我输出一个显示读取记录总数的附加列,以便在一次函数调用中返回所需的所有内容。
亲切的问候
答案 0 :(得分:1)
如果我理解正确,您可以添加:
SUM(ItemRead) OVER(PARTITION BY UserId) CountRead
修改强>
根据您的评论,您想要全部,而不是用户:
SUM(ItemRead) OVER(PARTITION BY 1) CountRead