2017-06-27 3 views
-1

Ich versuche, dies in LINQ zu tun. Können Sie mir helfen, dies zu tun? Gibt es ein Tool, das mir bei dieser Konvertierung hilft?SQL zu Linq mit Aggregatfunktion

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

Es sollte auf jeden Fall möglich sein - LINQ selbst ist ziemlich mächtig. Wie sieht dein aktueller Fortschritt aus? – Scott

+0

Versuchen Sie, Code einzubinden, den Sie ausprobiert haben, und beschreiben Sie, wo Ihr Fehler liegt. Davon abgesehen, [linq pad könnte Ihnen nützlich sein] (http://www.linqpad.net/). – Fabulous

+0

Ich versuche, diesen Code in Linq zu SQL zu konvertieren. Mein Fortschritt ist weniger als 0 – user2570306

Antwort

0

Offensichtlich nicht getestet. Auch unsicher, ob null Tests benötigt werden oder wie sie durch SQL-Übersetzung reagieren werden. Es ist möglicherweise vorzuziehen, die erste Abfrage so zu ändern, dass sie 0 zurückgibt, wenn sie nicht übereinstimmt, und dann einfach die Ergebnisse summiert, aber ich war mir nicht sicher, welchen Datentyp die Spalten haben.

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

Vielen Dank, Sie lösen nur mein Problem. – user2570306