【发布时间】:2018-09-10 20:28:11
【问题描述】:
我有一个如下所示的数据库表:
[Id] [int] IDENTITY(1,1) NOT NULL,
[TransactionID] [bigint] NOT NULL,
[Title] [nvarchar](120) NOT NULL,
[QuantitySoldTransaction] [int] NOT NULL,
[TransactionPrice] [float] NOT NULL,
[ItemID] [bigint] NOT NULL,
[TransactionDate] [datetime] NULL,
[StateOrProvince] [nvarchar](400) NULL,
[CountryName] [nvarchar](400) NULL,
[TwoCountryCode] [nvarchar](200) NULL,
[UserStoreId] [int] NOT NULL,
我必须通过这些参数对这些交易进行分组:
- ItemID => 商品销售额
- CountryName => 各国销售额
- 交易日期 => 销售日期
- 交易日期 => 一天中的小时销售额
- 交易日期 => 星期几的销售额
我有几件事我不完全理解我应该如何实现它。
例如,我显示的每个项目的销售额数据在不同的视图中完全分开,并且每个国家、小时和一周中的每一天的销售额也显示在不同的视图中。
我想在 Web 应用程序中引入自定义分页,这样我就可以避免一次从服务器中提取所有数据,从而减少服务器上的负载。
每次我拉出所有记录时,我都必须做一个 group by 语句来获取所需的数据。
例如:
ViewBag.Transactions = allStoreItems.GroupBy(x => x.ItemID)
.Select(pr => new TransactionsTabResults
{
Title = pr.Select(x=>x.Title).FirstOrDefault(),
ItemID = pr.Key.ToString(),
AveragePrice = Math.Round(pr.Average(y => y.TransactionPrice), 2),
TotalSoldItems = pr.Sum(x => x.QuantitySoldTransaction),
TotalRevenuePerItem = Math.Round(Convert.ToDecimal(pr.Sum(x => x.TransactionPrice * x.QuantitySoldTransaction)), 2)
}).OrderByDescending(x => x.TotalRevenuePerItem).ToList();
这些将是每个项目单独的销售额(每个项目 ID 的销售额)。这里可怕的是我一次提取所有数据,然后将其注入到用户的 DOM 中,这对最终用户和服务器来说性能都很糟糕。
我认为唯一的解决方案是自定义分页,这应该可以减少服务器上的负载。
所以我的问题是:如果我创建一个可以进行自定义分页的存储过程,但每次用户发出请求时仍会按分组进行,我猜这仍然具有糟糕的性能,因为分组的成本很高对吧?
所以我的想法是在我的以下之间创建一个表:
UserStores => New Table Here <= StoreTransactions
新表将包含每个参数的分组数据:
- 按一般日期(每月 30 天)、按项目 ID、按日期(按 24 小时)和再次按日期(按一周中的 7 天)..
所以这里的另一个问题是:多对多表是否会降低 SQL 查询的成本,从而使我能够更顺畅地对记录进行分页并显示我想要的内容?
【问题讨论】:
-
有人吗? =)
-
不确定它如何适合您的应用程序逻辑,但您是否考虑过创建索引视图,其中包含按您需要获取数据的级别分组的数据?
标签: c# asp.net sql-server stored-procedures group-by