【问题标题】:LINQ - Static columns transposition into aggregate rows valuesLINQ - 静态列转置为聚合行值
【发布时间】:2013-09-04 11:16:49
【问题描述】:

目前我的表格如下所示:

Id    StockCompanyId    StockIndexId    FilterDatePeriodId    Q0     Q1     Q2     Q3     Q4     Q5     Q6     Q7     Q8     Q9     Q10     Q11     Q12     Q13     Q14     Q15     Q16     Q17     Q18     Q19     Q20
6301  4                 1               NULL                  NULL   NULL   NULL   0.14   0.14   0.14   0.14   NULL   NULL   NULL   NULL    0.05    0.05    0.05    0.05    NULL    NULL    NULL    NULL    NULL    NULL
6553  1                 1               NULL                  NULL   NULL   NULL   0.53   0.53   0.53   0.53   0.58   0.58   0.58   0.58    0.55    0.55    0.55    0.55    0.50    0.50    0.50    0.50    0.43    0.43
6805  2                 1               NULL                  NULL   NULL   NULL   0.00   0.00   0.00   0.00   0.05   0.05   0.05   0.05    0.08    0.08    0.08    0.08    0.06    0.06    0.06    0.06    0.07    0.07
7057  3                 1               NULL                  NULL   NULL   NULL   0.11   0.11   0.11   0.11   0.13   0.13   0.13   0.13    0.17    0.17    0.17    0.17    0.17    0.17    0.17    0.17    0.17    0.17
7309  5                 1               NULL                  NULL   NULL   NULL   0.16   0.16   0.16   0.16  -0.16  -0.16  -0.16  -0.16    0.19    0.19    0.19    0.19   -0.34   -0.34   -0.34   -0.34    0.00    0.00

列在设计上是静态的,我们始终不再保留 20Q 的财务数据,当新季度到来时,我们将所有数据从左向右移动,并将新值放入 Q0

我目前需要的是上面带有聚合函数的转置版本。

对于选定的公司组(StockCompanyId 的集合),并提供股票指数 (StockIndexId)计算每个季度的平均值,并从最新季度到最新季度呈现它

所以最终的结果应该是这样的:

Quarter    Aggregated Value
0          0.53    <-- Average(values for all matched companies and provided stock index)
1          0.71
2          0.81
3          ...
4          ...
5          ...
6          ...
7          ...
8          ...
9          ...
10         ...
11         ...
12         ...
13         ...
14         ...
15         ...
16         ...
17         ...
18         ...
19         ...
20         ...

并将此数据作为 DTO 模型列表发送:

public class DTO
{
    public string Quarter {get; set;}
    public decimal AggregatedValue {get; set;}
}

List<DTO> ResponseValues

谁能帮我构建 LINQ 查询来满足这个要求?

【问题讨论】:

  • 您的表设计非常不标准,不适合 LINQ 样式的查询...除非您使用动态 LINQ,否则我看不出有任何方法可以执行少于 20 个查询。
  • 是的,我知道它们是非标准的,这是特定的财务设计。如果它是微不足道的,我不会在这里发布它。我相信它可以“以某种方式”实现。

标签: c# .net sql linq entity-framework


【解决方案1】:

这是一个杂牌,但这应该可以工作:

var matches = (
  from entry in table
  where entry.StockIndexId == StockIndexId
  where Companies.Contains(entry.StockCompanyId)
  select entry).ToList();

var ResponseValues = new List<DTO>();

ResponseValues.Add(new DTO {
  Quarter = 0,
  AggregatedValue = matches.Sum(
    match => match.Q0 ?? 0
  ) / matches.Length
});
ResponseValues.Add(new DTO {
  Quarter = 1,
  AggregatedValue = matches.Sum(
    match => match.Q1 ?? 0
  ) / matches.Length
});
... snip ...
ResponseValues.Add(new DTO {
  Quarter = 20,
  AggregatedValue = matches.Sum(
    match => match.Q20 ?? 0
  ) / matches.Length
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2015-06-09
    相关资源
    最近更新 更多