使用聚合函数的SQL到Linq

时间:2017-06-27 19:35:40

标签: c# sql linq

我正在尝试在LINQ中执行此操作。 你能帮助我做这个吗? 有一些工具可以帮助我进行这种转换吗?

SELECT
CODIGO_DEPENDENCIA,
SUM(COALESCE(LOCAL_MOVEL, 0))           AS LOCAL_MOVEL,
SUM(COALESCE(LOCAL_FIXO, 0))            AS LOCAL_FIXO,
SUM(COALESCE(DDD_MOVEL, 0))             AS DDD_MOVEL,
SUM(COALESCE(DDD_FIXO, 0))              AS DDD_FIXO,
SUM(COALESCE(EXTERNA_INTERNACIONAL, 0)) AS EXTERNA_INTERNACIONAL
FROM (
SELECT
CODIGO_DEPENDENCIA,
CASE WHEN TIPO = 'SELM'  THEN SUM(VALOR) END AS LOCAL_MOVEL,
CASE WHEN TIPO = 'SELF'  THEN SUM(VALOR) END AS LOCAL_FIXO,
CASE WHEN TIPO = 'SENM'  THEN SUM(VALOR) END AS DDD_MOVEL,
CASE WHEN TIPO = 'SENF'  THEN SUM(VALOR) END AS DDD_FIXO,
CASE WHEN TIPO = 'SEI'   THEN SUM(VALOR) END AS EXTERNA_INTERNACIONAL
FROM CAD_BILHETES
WHERE ID_PRODUTO IS NULL 
AND ID_COMPETENCIA = 60 
AND CODIGO_DEPENDENCIA IN (14, 160) 
AND TIPO IN ('SEI', 'SELM', 'SENF', 'SELF', 'SENM')
AND VALOR <> 0
GROUP BY TIPO,CODIGO_DEPENDENCIA
) TAB
GROUP BY CODIGO_DEPENDENCIA

1 个答案:

答案 0 :(得分:0)

显然未经测试。此外,不确定是否需要null测试或他们将如何通过SQL翻译做出反应。最好将第一个查询更改为在不匹配时返回0,然后只对结果求和,但我不确定列的数据类型。

var tab = from cb in CAD_BILHETES
      where cb.ID_PRODUTO == null && cb.ID_COMPETENCIA == 60 && (new[] { 14, 160 }).Contains(cb.CODIGO_DEPENDENCIA) &&
      (new[] { "SEI", "SELM", "SENF", "SELF", "SENM" }).Contains(cb.TIPO) && cb.VALOR != 0
      group cb by new { cb.TIPO, cb.CODIGO_DEPENDENCIA } into cbg
      select new { cbg.Key.CODIGO_DEPENDENCIA,
          LOCAL_MOVEL = (cbg.Key.TIPO == "SELM" ? cbg.SUM(cb => cb.VALOR) : null),
          LOCAL_FIXO = (cbg.Key.TIPO == "SELF" ? cbg.SUM(cb => cb.VALOR) : null),
          DDD_MOVEL = (cbg.Key.TIPO == "SENM" ? cbg.SUM(cb => cb.VALOR) : null),
          DDD_FIXO = (cbg.Key.TIPO == "SENF" ? cbg.SUM(cb => cb.VALOR) : null),
          EXTERNA_INTERNACIONAL = (cbg.Key.TIPO == "SEI" ? cbg.SUM(cb => cb.VALOR) : null),
      };

var ans = from cb in tab
      group cb by cb.CODIGO_DEPENDENCIA into cbg
      select new {
        CODIGO_DEPENDENCIA = cbg.Key,
          LOCAL_MOVEL = cbg.Sum(cb => cb.LOCAL_MOVEL == null ? 0 : cb.LOCAL_MOVEL),
          LOCAL_FIXO = cbg.Sum(cb => cb.LOCAL_FIXO == null ? 0 : cb.LOCAL_FIXO),
          DDD_MOVEL = cbg.Sum(cb => cb.DDD_MOVEL == null ? 0 : cb.DDD_MOVEL),
          DDD_FIXO = cbg.Sum(cb => cb.DDD_FIXO == null ? 0 : cb.DDD_FIXO),
          EXTERNA_INTERNACIONAL = cbg.Sum(cb => cb.EXTERNA_INTERNACIONAL == null ? 0 : cb.EXTERNA_INTERNACIONAL)
      };