Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak obliczyć obrót w każdym semestrze?

Tutaj możesz zobaczyć uproszczoną definicję i rozwiązanie swojego problemu (jeśli dobrze zrozumiałem):http ://sqlfiddle.com/#!9/48a2e1/1

CREATE TABLE foundry
(
    lru varchar(50) NOT NULL,
    client int  NOT NULL,
    purchase_date date,
    price int NOT NULL
);

INSERT INTO foundry (lru, client, purchase_date, price) VALUES
("article1", 4001, "01-01-16", 100),
("article1", 4001, "01-01-17", 200),
("article1", 4001, "01-02-16", 300),
("article1", 4001, "01-04-16", 400),
("article1", 4001, "01-06-16", 500),
("article1", 4001, "01-08-16", 600),
("article1", 4001, "01-10-16", 700),
("article1", 4001, "01-11-16", 800),
("article1", 4002, "01-01-16", 900),
("article1", 4002, "01-07-16", 1000),
("article1", 4002, "01-12-16", 1100);

Zasadniczo mamy tabelę z czterema kolumnami:lru (nazwa artykułu), klient, data zakupu i pewna cena.

Rozwiązanie wygląda tak:

SELECT lru, client, avg(price), COUNT(*) as total_items,
MONTHNAME(STR_TO_DATE(L, '%m')) as start_month, MONTHNAME(STR_TO_DATE(R, '%m')) as end_month FROM foundry,
(
  SELECT 1 as L, 6 as R
    UNION ALL
  SELECT 2, 7
    UNION ALL
  SELECT 3, 8
    UNION ALL
  SELECT 4, 9
    UNION ALL
  SELECT 5, 10
    UNION ALL
  SELECT 6, 11
    UNION ALL
  SELECT 7, 12
) months
WHERE month(purchase_date) >= L AND month(purchase_date) <= R
GROUP BY lru, client, L, R

Chodzi o to:

  1. Wygeneruj wszystkie możliwe kombinacje miesięcy:1-6, 2-7, ..., 7,12
  2. Połącz dane źródłowe z wygenerowaną kombinacją miesięcy
  3. Używaj AVG z GROUP BY

A wynik:

lru     client  avg(price)  total_items     start_month     end_month
article1    4001    300     5   January     June
article1    4001    400     3   February    July
article1    4001    500     3   March   August
article1    4001    500     3   April   September
article1    4001    600     3   May     October
article1    4001    650     4   June    November
article1    4001    700     3   July    December
article1    4002    900     1   January     June
article1    4002    1000    1   February    July
article1    4002    1000    1   March   August
article1    4002    1000    1   April   September
article1    4002    1000    1   May     October
article1    4002    1000    1   June    November
article1    4002    1050    2   July    December


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL MATCH nie działa z dwoma znakami?

  2. Jakie są różnice między procedurami składowanymi, funkcjami i procedurami?

  3. Sequelize:pola Concat w klauzuli WHERE LIKE

  4. Czy istnieje funkcja do zamykania przygotowanej instrukcji mysql za pomocą PDO?

  5. Procedury składowane przy użyciu MySQL Workbench