需要nelp向已经很复杂的SQL函数查询添加计数

时间:2016-01-06 13:30:54

标签: sql-server

我有一个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函数以允许我输出一个显示读取记录总数的附加列,以便在一次函数调用中返回所需的所有内容。

亲切的问候

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以添加:

SUM(ItemRead) OVER(PARTITION BY UserId) CountRead

修改

根据您的评论,您想要全部,而不是用户:

SUM(ItemRead) OVER(PARTITION BY 1) CountRead