비율 MySQL의 윈도우 함수를 계산하는 방법

Fachry Dzaky 알 - Qadri Sabil :

그래서 이와 같은 테이블 구조를 가질

CREATE TABLE sales(
    id_order VARCHAR(50) NOT NULL,
    fiscal_year INT NOT NULL,
    sale DECIMAL(14,2) NOT NULL,
    location varchar(50) NOT NULL,
    PRIMARY KEY(id_order,fiscal_year)
);

INSERT INTO sales(id_order,fiscal_year,sale, location)
VALUES(1,2016,100, 'Jakarta'),
      (2,2017,150, 'Bekasi'),
      (3,2018,200, 'Depok'),
      (4,2016,150, 'Jakarta'),
      (5,2017,100, 'Bekasi'),
      (6,2018,200, 'Depok'),
       (7,2016,200, 'Jakarta'),
      (8,2017,150, 'Bekasi'),
      (9,2018,250, 'Depok');

SELECT * FROM sales;

이 경우에, 나는 판매 금액에 대한 비율을 확인하고 위치를 통해 id_order의 계산하려면

내 경우에 따라이 예상 된 결과입니다 :

+----------+-----------+-----------+--------------------+----------------------+
| Location |  sale(kg) |  sale (%) |   count(id_order)  |  count(id_order) (%) |
+----------+-----------+-----------+--------------------+----------------------+
| Jakarta  |       450 | 30 %      |                  3 | 33,33%               |
| Bekasi   |       400 | 26,67 %   |                  3 | 33,33%               |
| Depok    |       650 | 43,33 %   |                  3 | 33,33%               |
| Total    |      1500 | 100 %     |                  9 | 100%                 |
+----------+-----------+-----------+--------------------+----------------------+

나는이 구문을 시도했습니다

SELECT 
    location,
    sum(sale)/ sum(sale) over()
    sum(count(id_order)) / sum(count(id_order)) over()
FROM
    sales
    group by location; 

하지만 SELECT 목록의 발현 # 2 GROUP BY 절에없는 및 GROUP BY 절에 컬럼에 기능적으로 의존하지 않는 집계되지 칼럼 'fiddle_WKQHEMOVYSDKFWLXWXHB.sales.sale'을 함유하는 것; 이것은 sql_mode = ONLY_FULL_GROUP_BY과 호환되지

여기 CHECK 데모

세바스찬 브로치 :

다음을 사용하여 다음과 같은 솔루션을 사용할 수 있습니다 SUM .. OVER:

SELECT DISTINCT 
  location AS `Location`, 
  SUM(sale) OVER (PARTITION BY location) AS `sale(kg)`,
  SUM(sale) OVER (PARTITION BY location) / SUM(sale) OVER () * 100 AS `sale (%)`,
  COUNT(id_order) OVER (PARTITION BY location) AS `count(id_order)`,
  COUNT(id_order) OVER (PARTITION BY location) / COUNT(id_order) OVER () * 100 AS `count(id_order) (%)`
FROM sales
UNION ALL
SELECT 'Total', SUM(sale), 100, COUNT(id_order), 100
FROM sales

...하거나 사용하여 다음과 같은 솔루션을 사용할 수 있습니다 GROUP BY으로WITH ROLLUP :

SELECT 
  IFNULL(location, 'Total') AS `Location`, 
  SUM(sale) AS `sale(kg)`,
  SUM(sale) / (SELECT SUM(sale) FROM sales) * 100 AS `sale (%)`, 
  COUNT(id_order) AS `count(id_order)`,
  COUNT(id_order) / (SELECT COUNT(id_order) FROM sales) * 100 AS `count(id_order) (%)`
FROM sales 
GROUP BY location WITH ROLLUP;

dbfiddle.uk에 데모

추천

출처http://43.154.161.224:23101/article/api/json?id=10253&siteId=1