複数のテーブルのデータを表示し、日付などの一部のフィールドで検索できるレポートを作成するためのベストプラクティスは何ですか?
レポートの構造は次のとおりです。
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