2016-04-22 17 views
1

mit der Nordwind-DB, ich muß eine Abfrage machen EmployeeName, Menge Aufträge pro Mitarbeiter und Durchschnittspreis dieser Aufträge bekommenSQL-Abfrage mit C# Northwind DB

das ist, was die Abfrage wie in SQL sieht

SELECT TOP 10 
a.LastName, a.FirstName, amountOfOrders = COUNT(DISTINCT b.OrderID), AveragePricePerOrder = SUM(c.Quantity*c.UnitPrice) /COUNT(DISTINCT b.OrderID) 
FROM Employees a join orders b on (a.EmployeeID = b.EmployeeID) 
    join [Order Details] c on b.OrderID = c.OrderID 
Group BY a.EmployeeID, a.LastName, a.FirstName 
ORDER BY amountOfOrders Desc 

dies läuft gut, aber ich muss diese # in c machen, und ich bin ein wenig hängen

Bisher habe ich diese

var query_rx = (from c in ctx.Employees 
         join or in ctx.Orders on c.EmployeeID equals or.EmployeeID 
         join ord in ctx.Order_Details on or.OrderID equals ord.OrderID 
         group c by new 
         { 
          c.EmployeeID, 
          c.LastName, 
          c.FirstName, 
          amount = c.Orders.Count 
         } into c 
         orderby c.Key.amount descending 
         select new 
         { 
          c.Key.LastName, 
          c.Key.FirstName, 
          amountOfOrders = c.Key.amount 
         }).Take(10); 
bekommen haben

„bearbeiten“ Ich habe Probleme, die durchschnittlich in, arbeiten versucht, eine Menge Dinge, aber ich kann es nicht

„bearbeiten“ Ich geändert haben die Abfrage ein wenig mit Hilfe von Dohnal Vorschlag an die Arbeit. Das sieht fast genau wie das, was ich in Bezug auf den Spalten will, außer, dass das Feld Nachname und Vorname ist leer, auch mit ToString

var query_rx = (from or in ctx.Order_Details 
         join ord in ctx.Orders on or.OrderID equals ord.OrderID 
         group or by new 
         { 
          ord.EmployeeID 
         } into c 
         orderby c.Select(x => x.OrderID).Distinct().Count() descending 
         select new 
         { 
          Lastname = (from emp in ctx.Employees 
             where c.Key.EmployeeID == emp.EmployeeID 
             select emp.LastName), 
          Firstname = (from emp in ctx.Employees 
             where c.Key.EmployeeID == emp.EmployeeID 
             select emp.FirstName), 
          c.Key.EmployeeID, 
          AmountOfOrders = c.Select(x => x.OrderID).Distinct().Count(), 
          AveragePricePerOrder = c.Sum(x => x.Quantity * x.UnitPrice)/c.Select(x => x.OrderID).Distinct().Count() 
         }).Take(10); 
+0

Ich nehme an Sie haben ein Problem mit diesem Teil 'summeOfOrders = COUNT (DISTINCT b.OrderID), AveragePricePerOrder = SUM (c.Quantity * c.UnitPrice)/COUNT (DISTINCT b.OrderID)'? –

+0

Ja, ich habe viele Dinge ausprobiert, aber ich kann den Durchschnitt nicht in – Sven

Antwort

0

Diese Abfrage:

var query = (from emp in ctx.Employers 
      join order in ctx.Orders on emp.EmployeeID equals order.EmployerID 
      join orderDet in ctx.Order_Details on order.OrderID equals orderDet.OrderID 
      group new { emp, order, orderDet } 
      by new { emp.FirstName, emp.LastName, emp.EmployeeID, order.OrderID } 
      into orderGroup 
      let a = new 
      { 
       orderGroup.Key.EmployeeID, 
       orderGroup.Key.FirstName, 
       orderGroup.Key.LastName, 
       orderGroup.Key.OrderID, 
       sum1 = orderGroup.Sum(x => x.orderDet.Quantity * x.orderDet.UnitPrice), 
      } 
      group a by new { a.FirstName, a.LastName, a.EmployeeID } into empGroup 
      let a2 = new 
      { 
       empGroup.Key.FirstName, 
       empGroup.Key.LastName, 
       sum = empGroup.Sum(x => x.sum1), 
       count = empGroup.Count() 
      } 
      orderby a2.count descending 
      select new 
      { 
       a2.FirstName, 
       a2.LastName, 
       amountOfOrders = a2.count, 
       AveragePricePerOrder = a2.sum/a2.count 
      }).Take(10); 
+0

arbeiten Das funktioniert, danke! Ein bisschen komplexer als ich erwartet hatte, aber sehr nett – Sven