Golden Basim Ответов: 2

Как создать сложное представление и объединить эти таблицы


привет,
во первых мне очень жаль если я не могу написать хорошее название и добро пожаловать на любые рекомендации
у меня есть "st_items- которые есть "stitems_Type"поле , это поле определяет, является ли товар "запасом" или "запасом с пользовательским серийным номером".

примеры строк данных st_items :-
----------------------------------------------------
stitems_ID | stitems_Type | stitems_MinBalance | ---
1          | 0            | 10                 | ---
2          | 0            | 20                 | ---
3          | 1            | 5                  | ---
4          | 1            | 15                 | ---
----------------------------------------------------

если "stitems_Type = 0" , то товар является "запасом"
в этом случае вся информация о запасах, относящаяся к данному товару, будет храниться в таблице под названием "stock_noserials"с этим примером строк :
---------------------------------
id | stitems_ID | StockQnty | ---
1  | 1          | 5         | ---
2  | 1          | 3         | ---
3  | 2          | 500       | ---
4  | 2          | 150       | ---
---------------------------------

как таблица "stock_noserials ", запас пункт 1 = 8 (сумма StockQnty colmun) и запаса пункт 2 = 650 (сумма StockQnty colmun)


если "stitems_Type = 1" , то товар называется "запас с сериалами"
в этом случае вся информация о запасах, относящаяся к данному товару, будет храниться в таблице под названием "purchases_item_seriels"с этим примером строк :
-------------------------------------
pis_ID| stitems_ID | pis_Statues| ---
1     | 3          | 1          | ---
2     | 3          | 2          | ---
3     | 3          | 4          | ---
4     | 3          | 5          | ---
5     | 4          | 2          | ---
-------------------------------------

pis_Statues (1 = в наличии , 2 = продано , 4 = потеряно , 5 = возвращено продаж) Итак , для получения запаса будет подсчитан товар, который имеет эти значения pis_Statues (1,5,6)

как таблица "purchases_item_seriels", запас пункт 3 = 2 (количество записей, где значение pis_Statues colmun равно (1,5,6)) и запас пункт 4 = 0

я хочу создать представления, которые будут предоставлять мне элементы дефицита, как это происходит :
--------------------------------------------------
stitems_ID | stitems_MinBalance | stock      | ---
1          | 10                 | 8          | ---
3          | 5                  | 2          | ---
4          | 15                 | 0          | ---
--------------------------------------------------


таким образом, я также могу создать хранимую процедуру, которая будет основана на этом представлении ..

Что я уже пробовал:

Я подумываю о том, чтобы создать Представление1 присоединиться st_itemsс stock_noserials и создание нового Изображение2 присоединиться st_itemsс purchases_item_seriels но я не знаю, как я могу создать представление, чтобы объединить эти два представления


теперь я получаю нехватку кода Entity Framework, но он очень медленный ..

st_itemsBindingSource.DataSource = nDB01.st_items
               .GroupBy(x => x.stitems_ID)
               .Select(grp => new
               {
                   itemID = grp.Key,
                   sumNoSerial = nDB01.stock_noserials.Where(u => u.stitems_ID == grp.Key).Sum(s => s.StockQnty),
                   sumWithSerial = nDB01.purchases_item_seriels.Where(u => (u.stitems_ID == grp.Key && u.pis_Statues == 0) ||
                                                                           (u.stitems_ID == grp.Key && u.pis_Statues == 5) ||
                                                                           (u.stitems_ID == grp.Key && u.pis_Statues == 6))
                                                                           .Count(),
                   minBalance = grp.Select(s => s.stitems_MinBalance).FirstOrDefault()
               })
                   .Where(u => u.minBalance >= (u.sumNoSerial+u.sumWithSerial)).ToList();


кроме того, я получаю его подсчет с помощью этого кода :
//Shortages النواقص
            int Shortages_StockNoSer = nDB01.stock_noserials
                .GroupBy(x => x.stitems_ID)
                .Select(grp => new
                {
                    itemID = grp.Key,
                    sum = grp.Sum(x => x.StockQnty),
                    min = grp.Select(s => s.st_items.stitems_MinBalance).FirstOrDefault()
                }).Where(u => u.sum < u.min && u.min != 0)
                .Count();
            int Shortages_StockWithSer = nDB01.purchases_item_seriels
               .GroupBy(x => x.stitems_ID)
               .Select(grp => new
               {
                   itemID = grp.Key,
                   sum = grp.Count(),
                   min = grp.Select(s => s.st_items.stitems_MinBalance).FirstOrDefault()
               }).Where(u => u.sum < u.min && u.min != 0)
               .Count();

            int CountShortagesItems = Convert.ToInt32( Shortages_StockNoSer) + Convert.ToInt32(Shortages_StockWithSer);

2 Ответов

Рейтинг:
17

Wendelius

Не уверен, что я правильно понял вопрос, но вы могли бы попробовать что-то вроде

WITH CurrentAmounts AS (
   SELECT sns.stitems_ID, 
          SUM(sns.StockQnty) AS Amount
   FROM stock_noserials sns
   GROUP BY sns.stitems_ID
) 
SELECT si.stitems_ID,
      si.stitems_MinBalance,
      COALESCE(ca.Amount,0) AS Stock
FROM st_items si,
     LEFT JOIN CurrentAmounts ca ON ca.stitems_ID = si.stitems_ID
WHERE COALESCE(ca.Amount,0) < si.stitems_MinBalance

А чтобы создать представление для приведенного выше запроса, просто поместите его в Создать инструкцию представления[^]

ДОПОЛНЕНИЕ:

Без ОТВ
SELECT si.stitems_ID,
      si.stitems_MinBalance,
      COALESCE(ca.Amount,0) AS Stock
FROM st_items si,
     LEFT JOIN (SELECT sns.stitems_ID, 
                       SUM(sns.StockQnty) AS Amount
                FROM stock_noserials sns
                GROUP BY sns.stitems_ID) ca 
     ON ca.stitems_ID = si.stitems_ID
WHERE COALESCE(ca.Amount,0) < si.stitems_MinBalance


Если нужно добавить в сумму, что-то вроде
SELECT si.stitems_ID,
      si.stitems_MinBalance,
      COALESCE(ca.Amount + pa.Amount,0) AS Stock
FROM st_items si,
     LEFT JOIN (SELECT sns.stitems_ID, 
                       SUM(sns.StockQnty) AS Amount
                FROM stock_noserials sns
                GROUP BY sns.stitems_ID) ca 
     ON ca.stitems_ID = si.stitems_ID
     LEFT JOIN (SELECT pis.stitems_ID, 
                       COUNT(*) AS Amount
                FROM purchases_item_seriels pis
                WHERE pis.pis_Statues IN (1, 5, 6)
                GROUP BY pis.stitems_ID) pa
     ON pa.stitems_ID = si.stitems_ID
WHERE COALESCE(ca.Amount + pa.Amount, 0) < si.stitems_MinBalance


Golden Basim

спасибо за ответ , 1 - он говорит неожиданное "с" (с)
2 - я зашел в эту таблицу "purchases_item_seriels" по вашему запросу

Wendelius

Для пункта 1. Возможно, вы используете более старую версию MySQL, которая не распознает CTE. Я обновил вопрос, чтобы использовать встроенное представление для запроса.

Что касается пункта 2, то я не уверен, что понимаю смысл таблицы purchases_item_seriels. Должны ли эти строки быть добавлены к сумме на складе? Если это так, взгляните на третий вариант ответа.

Golden Basim

да последний вопрос я думаю, что это то, что я имею в виду .. я попробую сейчас
спасибо

Golden Basim

у меня снова ошибка с синтаксисом (слева и сумма) , я использую MySQL server 5.7.21

Создать или заменить представление " дефицит` как
Выберите si.stitems_ID,
Си.stitems_MinBalance,
Сливаются(ок.Сумма + па.сумма,0) как запас
Из st_items si,
Левое соединение (выберите sns.stitems_ID,
Сумма(sns.StockQnty) как сумма
От stock_noserials sns
Группы в социальных сетях.stitems_ID) ка
На ca.stitems_ID = si.stitems_ID
Левое соединение (выберите pis.stitems_ID,
COUNT(*) как сумма
Из purchases_item_seriels мальчик
Где pis.pis_Statues в (1, 5, 6)
Группа по pis.stitems_ID) pa
На pa.stitems_ID = si.stitems_ID
Где сливаются(ок.Сумма + pa.сумма, 0) < si.stitems_MinBalance;

Wendelius

Извините, но после этого есть еще одна запятая si. Попробуйте с

CREATE OR REPLACE VIEW `shortages` as
   SELECT si.stitems_ID,
          si.stitems_MinBalance,
          COALESCE(ca.Amount, 0) + COALESCE(pa.Amount,0) AS Stock
   FROM st_items si
   LEFT JOIN (SELECT sns.stitems_ID,
                     SUM(sns.StockQnty) AS Amount
              FROM stock_noserials sns
              GROUP BY sns.stitems_ID) ca
   ON ca.stitems_ID = si.stitems_ID
   LEFT JOIN (SELECT pis.stitems_ID,
                     COUNT(*) AS Amount
              FROM purchases_item_seriels pis
              WHERE pis.pis_Statues IN (1, 5, 6)
              GROUP BY pis.stitems_ID) pa
   ON pa.stitems_ID = si.stitems_ID
   WHERE (COALESCE(ca.Amount, 0) + COALESCE(pa.Amount,0)) < si.stitems_MinBalance;


Но прежде чем создавать представление, вы можете попробовать оператор SELECT на самом себе, просто чтобы проверить, дает ли он правильные результаты

Golden Basim

я проверил его с реальными значениями .. это работа очень очень очень хорошо .. спасибо, что я построю много представлений на основе вашего запроса,,, так что вы предлагаете, что будет хорошо, если я выберу * из этого представления с EF или я должен также использовать хранимую процедуру ?

Wendelius

Пожалуйста :)

Я не думаю, что хранимая процедура даст здесь какую-то дополнительную выгоду, поэтому я лично выбрал бы представление напрямую.

Golden Basim

спасибо :)

Рейтинг:
0

Dirk Bahle

Вы должны создать Смотреть на сервере баз данных, чтобы воспользоваться преимуществами индексации и производительности сервера баз данных. Я был бы удивлен, если бы LINQ был разработан для обработки сложных сценариев, подобных этому, даже если вы можете сформулировать их в теории (или на практике).


Golden Basim

спасибо , я проверил эту документацию и другие .. но я не могу создать необходимый запрос