割合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と互換性がありません。

HEREチェックDEMO

セバスチャンブローチ:

あなたは使用して、以下のソリューションを使用することができます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 BYWITH 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=10255&siteId=1