1

このテーブル構造を考えると:

CREATE TABLE IF NOT EXISTS splits (
    id INT AUTO_INCREMENT,
    sector_id INT,
    type VARCHAR(100),
    percentage INT,
    PRIMARY KEY (id),
    INDEX (type)
) ENGINE MyISAM;

そしてこのデータセット:

INSERT INTO splits (sector_id, type, percentage) VALUES
(1, 'Manager', '50'),
(1, 'Sales Rep', '50'),
(2, 'Manager', '75'),
(2, 'Sales Rep', '25'),
(3, 'Manager', '75'),
(3, 'Sales Rep', '25'),
(4, 'Manager', '100'),
(5, 'Manager', '100'),
(6, 'Manager', '100');

同じ方法で分割されたセクターの量を返すにはどうすればよいですか?

このような:

Split          | Number
---------------+-------
50% M / 50% SR | 1
75% M / 25% SR | 2
100% M         | 3

つまり、これは、1つのセクター(id 1)の分割比率が50/50、2つのセクターの分割比率が75/25(id 2、3)、3つのセクターの分割比率が100/0(id 4、5)であることを示しています。 、6)。

これがデータベース設定のSQLフィドルです:http ://sqlfiddle.com/#!2 / 6b19f / 1

何を試しましたか?

どこから解決すればいいのかわからないので、解決策を提示できなかったことをお詫び申し上げます。どこかに行ったら、この質問を更新します。

これをすべてデータベース(アプリケーションではなく)で実行したい理由は、自動レポートツールがテーブル/ビュー/クエリをポイントし、フィルタリング、並べ替え、グラフ化などを自動的に適用できるためです。アプリケーションはすべてのデフォルト機能を失います。

4

1 に答える 1

1

私はその問題を本当に理解していません。DBには、取得したいすべてのデータがすでに含まれていますか?!

SELECT
  sector_id AS Number,
  type
  percentage
FROM
  splits

最も簡単な方法は、ソフトウェアを取得してから、それらの(type-percentage)タプルを文字列に変換することです。この文字列を作成して連結するためにデータベースが必要なのはなぜですか?

2秒を超えることはできますtypeか?

Postgresの場合、出力にタプルの配列を使用します。

SELECT
  sector_id,
  array_agg(row(percentage, type))
FROM
  splits
GROUP BY
  sector_id

正しいクエリ:

SELECT
  x.y,
  COUNT(*) c
FROM (
  SELECT
    sector_id,
    GROUP_CONCAT(CONCAT(percentage, '% '), type SEPARATOR ' / ') AS y
  FROM (
    SELECT
      sector_id,
      type,
      percentage
    FROM splits
    ORDER BY sector_id, type
  ) z
  GROUP BY sector_id
) x
GROUP BY x.y
ORDER by c

結果は次のようになります。

50% Manager / 50% Sales Rep | 1
75% Manager / 25% Sales Rep | 2
100% Manager                | 3
于 2013-03-04T01:42:33.923 に答える