【问题标题】:SQL command to LINQ (pivoting)SQL 命令到 LINQ(透视)
【发布时间】:2010-09-16 01:31:31
【问题描述】:

我正在将数据库从 MySQL(使用 ODBC)移动到 MS SQL,并且我想将 SQL 查询“翻译”到 LINQ。有人可以帮我解决这个问题(它应该按月对每个位置和分组结果进行 SUM Charge 列):

SELECT
sum(case when Location="Location1" then Charge else 0 end) as Location1,
sum(case when Location="Location2" then Charge else 0 end) as Location2,
sum(case when Location="Location3" then Charge else 0 end) as Location3,
MAKEDATE(YEAR(OrderTime),DAYOFYEAR(OrderTime)) AS date FROM Sales
GROUP BY YEAR(OrderTime),MONTH(OrderTime)
ORDER BY OrderTime DESC 

?

输出应如下所示:

Location1 | Location2 | Location3 | date

编辑:

我尝试使用此处的 LINQ 示例:

Is it possible to Pivot data using LINQ?

var query = context.log_sales
                            .GroupBy(c => c.OrderTime)
                            .Select(g => new
                            {
                                Date = g.Key,
                                Location1 = g.Where(c => c.Location == "Location1").Sum(c => c.Charge) ?? 0,
                                Location2 = g.Where(c => c.Location == "Location2").Sum(c => c.Charge) ?? 0
                            }).ToList();

这几乎是我所需要的。也应该按年份分组,我不知道该怎么做。

【问题讨论】:

  • 正在处理答案...只是想提一下 sql 中的 ORDER BY 无效。 OrderTime 被分组,不能在那里使用。

标签: sql linq pivot


【解决方案1】:

这可能会有所帮助。

context.log_sales
.GroupBy(s => new {Year = OrderTime.Year, Month = OrderTime.Month})
.Select
( g => new {
  Date = new DateTime(g.Key.Year, g.Key.Month, 1),
  Location1 = g.Where(s => s.Location == "Location1").Sum(s => s.Charge),
  Location2 = g.Where(s => s.Location == "Location2").Sum(s => s.Charge),
  Location3 = g.Where(s => s.Location == "Location3").Sum(s => s.Charge),
  }
)
.OrderBy(x => x.Date);

【讨论】:

  • 您是否检查过生成此 Linq 表达式的 SQL 是什么?这是相当巨大的。
【解决方案2】:

.. 你知道如何动态添加位置来选择吗?例如来自列表/数组。

编辑:.. 或者可能使位置动态加载并设置应在 Select 之前的 Where 语句中加载哪些位置。这可能吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多