3

Я занимался своей работой в Excel.and мои записи стали слишком много, и я хочу использовать mysql.i, у меня есть вид из db, у него есть столбцы «дата, запасы, продажи», я хочу добавить еще одно вычисленное поле, известное как «баланс запасов». Я знаю, что это должно быть сделано на стороне клиента во время ввода данных. У меня есть сценарий, который генерирует список/отчет по php только на основе представлений и таблиц, у него нет возможности добавлять поля вычислений, поэтому я хотел бы сделать представление в mysql, если это возможно.Расчет Mysql в операторе select

in excel Я использовал для этого следующим образом.

enter image description here

я хотел бы знать, если это возможно в MySQL.

enter image description here

я не имеют большого опыта с моим SQL, но я представить себе первый один должен быть в состоянии выбрать предыдущий row.colomn4 затем добавить его к текущему row.colomn2 минус текущий row.colomn3

Если есть другой способ достичь того же самого предложения, пожалуйста, предложите.

ответ

3

Eggyal имеет четыре хороших решений. Я думаю, что самый чистый способ сделать общее количество в MySQL - это использовать коррелированный подзапрос - он исключает group by в конце. Поэтому я бы добавил к списку вариантов:

SELECT sr.Sale_Date, sr.Stock_Delivered, sr.Units_Sold, 
     (select SUM(sr2.Stock_Delivered) - sum(sr2.Units_Sold) 
     from sales_report sr2 
     where sr2.sale_date <= sr.sale_date 
     ) as StockBalance 
FROM sales_report sr 
ORDER BY Sale_Date 
+0

Спасибо, Гордон Линофф работал отлично. Теперь я понимаю, как это работает.это был просто взгляд из одной из многих таблиц, которые у меня есть. Я сделаю то же самое с остальными. Я также принял некоторые идеи от eggyal. Спасибо снова, что я был на этом сейчас в течение 2 дней. – Law

0
SELECT 
    sales_report.Stock_Delivered, 
    sales_report.Units_Sold, 
    sales_report.Stock_Delivered - sales_report.Units_Sold 
FROM 
    sales_report; 
+1

OP хочет скопировать текущую сумму, а не просто показывать движение дня. – eggyal

+0

@Brad спасибо за попытку, но я думаю, я раньше не был ясен, расчет мне нужен («баланс предыдущего дня» + «запас поставлен» - «Единицы сказали») – Law

+0

Ahh..sorry 'bout that - I «Рад, что вы получили правильный ответ! – Brad

6

Вообще говоря, SQL на самом деле не предназначался для получения «текущих итогов», как вы этого хотите. Другие РСУБД внедрили собственные расширения для доставки аналитических функций, которые позволяют проводить вычисления такого рода, но MySQL не имеет таких функций.

Вместо этого один из них имеет четыре варианта. В каком-либо конкретном порядке:

  1. Накопить общее количество в вашем приложении, когда вы выполняете цикл по набору результатов;

  2. Измените свою схему, чтобы отслеживать текущую общую сумму в вашей базе данных (особенно хорошо в таких ситуациях, когда новые данные только добавляются «до конца»);

  3. Группа автообъединение:

    SELECT a.Sale_Date, 
         SUM(a.Stock_Delivered)    AS Stock_Delivered, 
         SUM(a.Units_Sold)      AS Units_Sold, 
         SUM(b.Stock_Delivered - b.Units_Sold) AS `Stock Balance` 
    FROM  sales_report a 
        JOIN sales_report b ON b.Sale_Date <= a.Sale_Date 
    GROUP BY a.Sale_Date 
    
  4. Накопить запущенную всего в user variable:

    SELECT Sale_Date, 
         Stock_Delivered, 
         Units_Sold, 
         @t := @t + Stock_Delivered - Units_Sold AS `Stock Balance` 
    FROM  sales_report, (SELECT @t:=0) init 
    ORDER BY Sale_Date 
    
+0

Спасибо, это очень полезная информация, по крайней мере теперь у меня есть идея, я над этим работаю. – Law