Как посчитать, сколько клиентов приобрели продукт в SQL - PullRequest
0 голосов
/ 16 июня 2019

У меня есть приложение C #, которое отображает продукты, которые продает компания.Рядом с этим столбцом находится тип продукта, а в последнем столбце указано количество покупателей, которые купили этот продукт.Это мой SQL-запрос для заполнения первых двух столбцов:

string selectQuery;
selectQuery = "SELECT Products.ProductID, Products.ProductTypeID, ";
selectQuery = selectQuery + "Products.ProductName, Products.YearlyPremium, ProductTypes.ProductType ";
selectQuery = selectQuery + "FROM Products ";
selectQuery = selectQuery + "INNER JOIN ProductTypes ON Products.ProductTypeID = ProductTypes.ProductTypeID "

Теперь мне нужно выяснить, сколько клиентов купили каждый продукт.Я думаю, мне нужно использовать метод COUNT(*), чтобы получить CustomerID's, но теперь уверен, как интегрировать его в этот запрос.Вот схема enter image description here

Код, который я использую для отображения данных в списке, выглядит так:

SqlConnection conn = ConnectionsManager.DatabaseConnection();
        SqlDataReader rdr = null;
        try
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(selectQuery, conn);
            rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                Products product = new Products(int.Parse(rdr["ProductID"].ToString()),
                                     int.Parse(rdr["ProductTypeID"].ToString()),
                                     rdr["ProductName"].ToString(),
                                     Math.Round(decimal.Parse(rdr["YearlyPremium"].ToString()), 2));
                ProductTypes productType = new ProductTypes(int.Parse(rdr["ProductTypeID"].ToString()),
                                     rdr["ProductType"].ToString());

                ListViewItem lvi = new ListViewItem(product.ProductName.ToString());
                lvi.SubItems.Add(productType.ProductType.ToString());
                \\lvi.SubItems.Add(customer.CustomerID.ToString()); <---this will be the line to display the customer count
                lvMain.Items.Add(lvi);
            }
            if (rdr != null)
                rdr.Close();
            conn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Unsuccessful" + ex);
        }

Ответы [ 3 ]

0 голосов
/ 16 июня 2019

попробуйте использовать предложение Group by. Это будет работать. Пример:

SELECT COUNT(ProductId),CustomerId
FROM Product
GROUP BY CustomerId;

вид этого

0 голосов
/ 16 июня 2019

Казалось бы, вам нужен простой GROUP BY запрос:

SELECT p.ProductID, p.ProductTypeID, p.ProductName, p.YearlyPremium,
       pt.ProductType,
       COUNT(DISTINCT s.CustomerID) as num_customers
FROM Products p INNER JOIN
     ProductTypes pt
     ON p.ProductTypeID = PT.ProductTypeID LEFT JOIN
     Sales S
     ON s.ProductID = p.ProductID 
GROUP BY p.ProductID, p.ProductTypeID, p.ProductName, p.YearlyPremium, pt.ProductType;

Примечания:

  • Используется от LEFT JOIN до Sales для получения продуктов, которые не продаются.
  • При этом используются значения от INNER JOIN до ProductTypes, поскольку, предположительно, все продукты имеют тип.
  • В GROUP BY есть все неагрегированные столбцы.
  • Это учитывает уникальные идентификаторы клиентов, поскольку один и тот же клиент мог купить один и тот же продукт более одного раза. Если вы просто хотите подсчитать количество записей в Sales, удалите DISTINCT.
0 голосов
/ 16 июня 2019

Учитывая, что ProductTypeId должен быть значением NON NULL в конечном результате (следовательно, с использованием INNER JOIN), SQL-части, которую вы должны будете встроить в код C #:

SELECT  P.ProductID, P.ProductTypeID, P.ProductName, P.YearlyPremium, PT.ProductType, CustomerCount = COUNT(S.CustomerID)
FROM    Sales S
        INNER JOIN Products P
           ON S.ProductID = P.ProductID
        INNER JOIN ProductTypes PT 
           ON P.ProductTypeID = PT.ProductTypeID 
GROUP   BY P.ProductID, P.ProductTypeID, P.ProductName, P.YearlyPremium, PT.ProductType

Примечание: - поскольку вам не нужен какой-либо атрибут клиента, и у вас есть внешний ключ в столбце Sales.CustomerID для столбца Customer.CustomerId, следовательно, для получения CustomerCount присоединение к таблице Customer не требуется. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...