1: [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read,
2: TableDefinition = "Region nvarchar(50),TotalPorRegion int, Producto nvarchar(40), TotalVentas money,Promedio money",
3: FillRowMethodName = "LlenadoRegiostroConsulta")]
4: public static IEnumerable ConsultaEspecial(int ProductoId) {
5: var cnx = new SqlConnection("context connection=true");
6: var cmd = new SqlCommand(@"SELECT DISTINCT Region.RegionDescription
7: FROM Orders INNER JOIN
8: EmployeeTerritories INNER JOIN
9: Employees ON EmployeeTerritories.EmployeeID = Employees.EmployeeID INNER JOIN
10: Territories ON EmployeeTerritories.TerritoryID = Territories.TerritoryID INNER JOIN
11: Region ON Territories.RegionID = Region.RegionID ON Orders.EmployeeID = Employees.EmployeeID INNER JOIN
12: [Order Details] ON Orders.OrderID = [Order Details].OrderID INNER JOIN
13: Products ON [Order Details].ProductID = Products.ProductID
14: WHERE (Products.ProductID = @ProductID)", cnx);
15: cmd.Parameters.AddWithValue("@ProductID", ProductoId);
16:
17: cnx.Open();
18: var dr = cmd.ExecuteReader();
19: var regiones = new List<string>();
20: while (dr.Read()) {
21: regiones.Add(dr[0].ToString());
22: }
23: dr.Close();
24:
25: var tablaResultado = new List<EstructuraEspecial>();
26:
27: foreach (var region in regiones) {
28: var cmdTotalPorRegion = new SqlCommand(@"SELECT COUNT(Region.RegionDescription) AS TotalOrdenesPorRegion
29: FROM Orders INNER JOIN
30: EmployeeTerritories INNER JOIN
31: Employees ON EmployeeTerritories.EmployeeID = Employees.EmployeeID INNER JOIN
32: Territories ON EmployeeTerritories.TerritoryID = Territories.TerritoryID INNER JOIN
33: Region ON Territories.RegionID = Region.RegionID ON Orders.EmployeeID = Employees.EmployeeID INNER JOIN
34: [Order Details] ON Orders.OrderID = [Order Details].OrderID INNER JOIN
35: Products ON [Order Details].ProductID = Products.ProductID
36: WHERE (Products.ProductID = @ProductID) AND (Region.RegionDescription = @Region)", cnx);
37: cmdTotalPorRegion.Parameters.AddWithValue("@ProductID", ProductoId);
38: cmdTotalPorRegion.Parameters.AddWithValue("@Region", region);
39: var total = cmdTotalPorRegion.ExecuteScalar();
40: var e = new EstructuraEspecial();
41: e.Region = region;
42: e.TotalPorRegion = SqlInt32.Parse(total.ToString());
43: tablaResultado.Add(e);
44: }
45:
46: var cmdProducto = new SqlCommand(@"SELECT ProductName, UnitPrice
47: FROM Products
48: WHERE (ProductID = @ProductID)", cnx);
49: cmdProducto.Parameters.AddWithValue("@ProductID", ProductoId);
50: dr = cmdProducto.ExecuteReader();
51: SqlString producto = string.Empty; SqlMoney precio = 0;
52: if (dr.Read()) {
53: producto = dr["ProductName"].ToString();
54: precio = SqlMoney.Parse(dr["UnitPrice"].ToString());
55: }
56: dr.Close();
57:
58: cnx.Close();
59:
60: foreach (var res in tablaResultado) {
61: res.Producto = producto;
62: res.TotalVentas = res.TotalPorRegion * precio;
63: res.Promedio = res.TotalVentas / res.TotalPorRegion;
64: }
65:
66: return tablaResultado.ToArray();
67: }