3

複数のテーブルのデータを表示し、日付などの一部のフィールドで検索できるレポートを作成するためのベストプラクティスは何ですか?

レポートの構造は次のとおりです。

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

私が考えることができるのは、ストアドプロシージャとOUTPUTパラメータを使用してレポートを作成することだけです。これは非常にうまく機能しますが、SQLServer側とアプリケーションの両方で面倒な作業です。私はこれを行う他の方法を知りません。

カーソルを使用するか、別のストアドプロシージャまたはその他の手法を使用して実行できる可能性があります。より良いアプローチに私を導いていただけませんか?助けていただければ幸いです。

これが私の現在のアプローチです

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

パラメータは設定可能などです...これまで聞いたことがない/見た/使用したことがありませんか?

たとえば、これが私たちのレポートの1つです-このレポートを実際に作成するのに最大1時間しかかかりません...

私たちのレポートの1つ

于 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 に答える