【问题标题】:How can I achieve SQL Pivot statement from LINQ如何从 LINQ 实现 SQL Pivot 语句
【发布时间】:2017-10-06 20:22:30
【问题描述】:

我希望通过 LINQ 实现以下 SQL 语句。我不确定这是否可能?有人可以建议我吗?

SELECT *
FROM (
    SELECT CONVERT(VARCHAR, (DATEADD(WEEK, DATEDIFF(WEEK, 0, S.SampleDrawn), 0)), 101) [Date], [Range] =
        CASE 
            WHEN ProbBacteremia >= 0 AND ProbBacteremia < 0.50 THEN 'Low'
            WHEN ProbBacteremia >= 0.50 AND ProbBacteremia < 0.75 THEN 'Med' 
            ELSE 'High'
        END
    FROM Result.Calculation C INNER JOIN Data.SampleSet S ON C.SampleSetID = S.ID  WHERE  S.SampleDrawn >= DATEADD(WEEK,-1,GETDATE())) o
    PIVOT
    (
        COUNT(o.[Range])
        FOR [Range] IN (
        [Low], [Med], [High])
    ) pt
    ORDER BY [Date]

以上查询的结果如下

日期 低 中 高 2017 年 9 月 4 日 370 174 175 2017 年 9 月 11 日 764 352 389 2017 年 9 月 18 日 759 384 360 2017 年 9 月 25 日 765 385 404 2017 年 10 月 2 日 115 48 56

请注意,以上日期已按周分组。 IE。 09/04 , 09/11, 09/18 等。我做了很多研究,但我发现只能按周数分组。

这是我所能想到的 LINQ,它将返回以下结果集。

data = (from a in context.Calculations
                             where a.SampleSet.SampleDrawn >= dtStart && (isDeptFilter || a.SampleSet.Department == location)
                             group a by new { Text = RangeProvider(a.ProbBacteremia * 100, riskCats), Date = a.SampleSet.SampleDrawn.Date } into groupedData
                             orderby groupedData.Key.Date ascending
                             select new { Value = groupedData.Count(), Text = groupedData.Key.Text, Date = groupedData.Key.Date.ToShortDateString() }).ToList();

public static string RangeProvider(int value)
        {
            if (value > 0 && value <= 25)
            { return "Low"; }
            if (value > 25 && value <= 75)
            { return "Medium"; }
            if (value > 75 && value <= 90)
            { return "High"; }
            else
            { return "Very High"; }
        }

obver LINQ的结果数据集是

日期文本值 09/04/2017 低 65 09/04/2017 地中海 80 09/04/2017 高 40 09/05/2017 低 30 10/05/2017 地中海 50 2017 年 10 月 5 日 高 44

希望这能解释我想要实现的目标。请问有人可以帮我吗?

【问题讨论】:

  • linq中没有原生pivot,但是你可以创建自己的code.msdn.microsoft.com/windowsdesktop/…
  • 这是那些反复出现的问题之一,因为没有得到满意的答案。
  • 好的,我明白了。有人知道如何按上述结果集按周分组吗?使用 LINQ。

标签: sql sql-server entity-framework linq entity-framework-core


【解决方案1】:

作为一种变通方法,我使用了 Entity Framework Core 的“FromSQL”方法来执行我的存储过程,该过程负责处理所有的 GROUP BY。

【讨论】:

    【解决方案2】:

    你可以用这个。

    data = (from a in context.Calculations
                 where a.SampleSet.SampleDrawn >= dtStart && (isDeptFilter || a.SampleSet.Department == location)
                 group a by new { Text = RangeProvider(a.ProbBacteremia * 100, riskCats), Date = a.SampleSet.SampleDrawn.Date } into groupedData
                 orderby groupedData.Key.Date ascending
                 select new { 
                     Date = groupedData.Key.Date.ToShortDateString() ,
                     Low = ( groupedData.Key.Text =="Low" )?groupedData.Count() : 0,
                     Medium = ( groupedData.Key.Text =="Medium" )?groupedData.Count() : 0,
                     High = ( groupedData.Key.Text =="High" )?groupedData.Count() : 0,
                     VeryHigh = ( groupedData.Key.Text =="Very High" )?groupedData.Count() : 0
                 }).ToList();
    

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 1970-01-01
      • 2020-06-11
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多