构建显示来自多个表的数据并且可以按某些字段(例如按日期)搜索的报告的最佳实践是什么?
报告的结构如下:
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