3

构建显示来自多个表的数据并且可以按某些字段(例如按日期)搜索的报告的最佳实践是什么?

报告的结构如下:

                Today    Yesterday  Last 7 days     All
New Users         0         10        20           1000
Sold Products     11        21        31           25000

我能想到的只是使用存储过程和 OUTPUT 参数构建报告,它工作得很好,但在 SQL Server 端和应用程序中都是一项乏味的工作。我只是不知道这样做的任何其他方式。

也许可以通过使用游标或使用不同的存储过程或其他一些技术来完成。你能引导我找到更好的方法吗?我很感激任何帮助。

这是我目前的方法

CREATE PROCEDURE sp_Statistics
    @DateFrom datetime = NULL, 
    @DateTo datetime = NULL,

    @UsersRegisteredToday int = 0 OUTPUT,
    @UsersRegisteredYesterday int = 0 OUTPUT, 
    @UsersRegisteredLastSevenDays int = 0 OUTPUT,
    @UsersRegisteredTotal int = 0 OUTPUT,
    @UsersRegisteredDate int = 0 OUTPUT,

    @SoldProductsToday int = 0 OUTPUT,
    @SoldProductsYesterday int = 0 OUTPUT, 
    @SoldProductsLastSevenDays int = 0 OUTPUT,
    @SoldProductsTotal int = 0 OUTPUT,
    @SoldProductsDate int = 0 OUTPUT
AS
BEGIN

--------------------- REGISTERED USERS -----------------------
IF (@DateFrom IS NOT NULL OR @DateTo IS NOT NULL)
    BEGIN
        SELECT @UsersRegisteredDate = COUNT(*)
        FROM [User] u
        WHERE DATEADD(DAY, DATEDIFF(D, 0, u.Date), 0) BETWEEN @DateFrom AND @DateTo
    END
ELSE IF @DateFrom IS NULL AND @DateTo IS NULL
    BEGIN
        SELECT @UsersRegisteredToday = COUNT(DISTINCT u.idUser)
        FROM [User] u
        LEFT JOIN [Order] e ON u.idUser = e.idUser
        WHERE DATEDIFF(d, GETDATE(), u.Date) = 0

        SELECT @UtilizadoresYesterday = COUNT(DISTINCT u.idUser)
        FROM [User] u
        LEFT JOIN [Order] e ON u.idUser = e.idUser
        WHERE DATEDIFF(d, GETDATE(), u.Date) = -1

        SELECT @UsersRegisteredLastSevenDays = COUNT(DISTINCT u.idUser)
        FROM [User] u
        LEFT JOIN [Order] e ON u.idUser = e.idUser
        WHERE DATEDIFF(d, GETDATE(), u.Date) >= -7

        SELECT @UsersRegisteredTotal = COUNT(DISTINCT u.idUser)
        FROM [User] u
        LEFT JOIN [Order] e ON u.idUser = e.idUser
    END

--------------------- SOLD PRODUCTS --------------------------
IF (@DateFrom IS NOT NULL OR @DateTo IS NOT NULL)
    BEGIN
        SELECT @SoldProductsDate = COUNT(*)
        FROM [Order] e
        WHERE e.idPaymentState = 2
              AND
              DATEADD(DAY, DATEDIFF(D, 0, e.Date), 0) BETWEEN @DateFrom AND @DateTo
    END
ELSE IF @DateFrom IS NULL AND @DateTo IS NULL
    BEGIN

        SELECT @SoldProductsToday = COUNT(*) 
        FROM [Order] e 
        LEFT JOIN [User] u ON e.idUser = u.idUser
        WHERE e.idPaymentState = 2 AND DATEDIFF(d, GETDATE(), e.Date) = 0

        SELECT @SoldProductsYesterday = COUNT(*)
        FROM [Order] e
        LEFT JOIN [User] u ON e.idUser = u.idUser
        WHERE e.idPaymentState = 2 AND DATEDIFF(d, GETDATE(), e.Date) = -1

        SELECT @SoldProductsLastSevenDays = COUNT(*)
        FROM [Order] e
        LEFT JOIN [User] u ON e.idUser = u.idUser
        WHERE e.idPaymentState = 2 AND DATEDIFF(d, GETDATE(), e.Date) >= -7

        SELECT @SoldProductsTotal = COUNT(*)
        FROM [Order] e
        LEFT JOIN [User] u ON e.idUser = u.idUser
        WHERE e.idPaymentState = 2
    END
END
4

3 回答 3

3

您是否考虑过使用 SSRS?SQL Reporting Services,它与 SQL 捆绑在一起。我在这里叫错树了吗?

我会考虑使用它来创建报告,因为它是一个报告工具

你只需用一些参数写你的数据'SELECT'

例如

SELECT SomeValue, SomeOtherValue FROM SomeTable WHERE SomeValue = @SomeParameter

参数是可配置的等...您以前没有听说过/见过/使用过它吗?

例如,这是我们的一份报告——写这份报告只需要一个小时……

我们的一份报告

于 2012-10-12T11:09:12.890 回答
3

我不会使用输出参数,而是在 sp 中创建一个临时表并将数据插入其中,然后一旦所有数据都在那里,就对其进行选择。

如果您在应用程序中使用网格或 Charleh 建议使用 SSRS 的更好选择,那么创建报告本身应该相当容易。然后,您可以将 SSRS 报告查看器嵌入到您的应用程序中。

于 2012-10-12T11:12:51.743 回答
1

最好使用表值 UDF

CREATE FUNCTION fn_Statistics
(
    @DateFrom datetime = NULL, 
    @DateTo datetime = NULL
)
RETURNS @Report TABLE(
    Today int,
    Yesterday,
    LastSevenDays,
    Total int,
    [Date] int)
AS    
BEGIN
--------------------- REGISTERED USERS -----------------------
IF (@DateFrom IS NOT NULL OR @DateTo IS NOT NULL)
    BEGIN
        INSERT @Report
        SELECT 0,0,0,0,COUNT(*)
        FROM [User] u
        WHERE DATEADD(DAY, DATEDIFF(D, 0, u.Date), 0) BETWEEN @DateFrom AND @DateTo;
--------------------- SOLD PRODUCTS --------------------------        
        INSERT @Report
        SELECT 0,0,0,0,COUNT(*)
        FROM [Order] e
        WHERE e.idPaymentState = 2
              AND
              DATEADD(DAY, DATEDIFF(D, 0, e.Date), 0) BETWEEN @DateFrom AND @DateTo;

    END
    ELSE IF @DateFrom IS NULL AND @DateTo IS NULL
    BEGIN
        DECLARE @UsersRegisteredToday int,
                @UsersRegisteredYesterday int,
                @UsersRegisteredLastSevenDays int,
                @UsersRegisteredTotal int;

        SELECT @UsersRegisteredToday = COUNT(DISTINCT u.idUser)
        FROM [User] u
        LEFT JOIN [Order] e ON u.idUser = e.idUser
        WHERE DATEDIFF(d, GETDATE(), u.Date) = 0

        SELECT @UtilizadoresYesterday = COUNT(DISTINCT u.idUser)
        FROM [User] u
        LEFT JOIN [Order] e ON u.idUser = e.idUser
        WHERE DATEDIFF(d, GETDATE(), u.Date) = -1

        SELECT @UsersRegisteredLastSevenDays = COUNT(DISTINCT u.idUser)
        FROM [User] u
        LEFT JOIN [Order] e ON u.idUser = e.idUser
        WHERE DATEDIFF(d, GETDATE(), u.Date) >= -7

        SELECT @UsersRegisteredTotal = COUNT(DISTINCT u.idUser)
        FROM [User] u
        LEFT JOIN [Order] e ON u.idUser = e.idUser

        INSERT @Report VALUES(@UsersRegisteredToday,
                              @UsersRegisteredYesterday,
                              @UsersRegisteredLastSevenDays,
                              @UsersRegisteredTotal,
                              0);
        --------------------- SOLD PRODUCTS --------------------------

        DECLARE @SoldProductsToday int,
                @SoldProductsYesterday int,
                @SoldProductsLastSevenDays int,
                @SoldProductsTotal int;

        SELECT @SoldProductsToday = COUNT(*) 
        FROM [Order] e 
        LEFT JOIN [User] u ON e.idUser = u.idUser
        WHERE e.idPaymentState = 2 AND DATEDIFF(d, GETDATE(), e.Date) = 0

        SELECT @SoldProductsYesterday = COUNT(*)
        FROM [Order] e
        LEFT JOIN [User] u ON e.idUser = u.idUser
        WHERE e.idPaymentState = 2 AND DATEDIFF(d, GETDATE(), e.Date) = -1

        SELECT @SoldProductsLastSevenDays = COUNT(*)
        FROM [Order] e
        LEFT JOIN [User] u ON e.idUser = u.idUser
        WHERE e.idPaymentState = 2 AND DATEDIFF(d, GETDATE(), e.Date) >= -7

        SELECT @SoldProductsTotal = COUNT(*)
        FROM [Order] e
        LEFT JOIN [User] u ON e.idUser = u.idUser
        WHERE e.idPaymentState = 2

        INSERT @Report VALUES(@SoldProductsToday,
                              @SoldProductsYesterday,
                              @SoldProductsLastSevenDays,
                              @SoldProductsTotal,
                              0);
    END
    RETURN
 END
于 2012-10-12T11:23:35.403 回答