2017-06-27 70 views
-1

我想在LINQ中这样做。 你们能帮我做这个吗? 有一些工具可以帮助我进行此转换吗?SQL到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 
+0

它应该是可能的 - LINQ本身是相当强大的。你现在的进度是什么样子? – Scott

+0

尝试包含您尝试过的一些代码,并描述您的失败位置。这就是说,[linq垫可能是有用的](http://www.linqpad.net/)给你。 – Fabulous

+0

我试图将这段代码转换为SQL到LINQ。 我的进度小于0 – user2570306

回答

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) 
     }; 
+0

非常感谢你,你只是解决了我的问题。 – user2570306