0

この方法で構築された2つのテーブルがあります:

Trips
- id
- organization_id REQUIRED
- collaboration_organization_id OPTIONAL
...other useless fields...

Organizations
- id
- name REQUIRED
...other useless fields...

今、私はこのタイプのレポートを作成するように依頼されました:

組織ごとにすべての旅行の合計が必要です。collaboration_organization_id を持っている場合は 0.5 としてカウントする必要があるため、collaboration_organization_id の組織も +0.5 を取得することは明らかです。

したがって、organization_id と Collaboration_organization_id が設定された出張がある場合、その出張は両方の組織で 0.5 としてカウントされます。代わりに、organization_id のみが設定されている場合は、1 としてカウントされます。

今、私の質問は2つの部分で構成されています:

1.

問題をすべてSQLで「解決」することは良い考えですか?

私はコードでそれを解決する方法をすでに知っています。私の考えは現在、「すべての旅行 (これらの 3 つのフィールドのみ) を選択し、Ruby でカウントを開始する」ことです。私は ruby​​ on rails を使用しているので、「いいえ、mysql でしか動作しないから」と言う正当な理由になる可能性があることを考慮してください。

2.

ポイント1がYESの場合、countは「投げて実行する」関数であるため、必要な場所で各トリップを0.5カウントする方法がわかりません

4

1 に答える 1

2

ruby on rails には詳しくありませんが、MySQL でこれを行う方法は次のとおりです。

サンプルデータ:

CREATE TABLE Trips(
  id int not null primary key,
  organization_id int not null,
  collaboration_organization_id int null
  );

INSERT INTO Trips (id,organization_id,collaboration_organization_id)
VALUES
(1,1,5),
(2,1,1),
(3,1,2),
(4,11,1),
(5,1,null),
(6,2,null),
(7,10,null),
(8,6,2),
(9,1,3),
(10,1,4);

MySQL クエリ:

SELECT organization_id,
sum(CASE WHEN collaboration_organization_id IS null THEN 1 ELSE 0.5 End) AS number
FROM Trips
GROUP BY organization_id;

http://www.sqlfiddle.com/#!2/1b01d/107で試してみてください。

編集: コラボレーション組織の追加

サンプルデータ:

  CREATE TABLE Trips(
  id int not null primary key,
  organization_id int not null,
  collaboration_organization_id int null
  );

INSERT INTO Trips (id,organization_id,collaboration_organization_id)
VALUES
(1,1,5),
(2,1,1),
(3,1,2),
(4,11,1),
(5,1,null),
(6,2,null),
(7,10,null),
(8,6,2),
(9,1,3),
(10,1,4);


CREATE TABLE Organizations(
  id int auto_increment primary key,
  name varchar(30)
  );

INSERT INTO Organizations (name)
VALUES
("Org1"),
("Org2"),
("Org3"),
("Org4"),
("Org5"),
("Org6"),
("Org7"),
("Org8"),
("Org9"),
("Org10"),
("Org11"),
("Org12"),
("Org13"),
("Org14"),
("Org15"),
("Org16");

MySQL クエリ:

SELECT O.id, O.name,
sum(CASE WHEN T.collaboration_organization_id IS null THEN 1 ELSE 0.5 End) AS number
FROM Organizations AS O LEFT JOIN Trips AS T  
ON T.organization_id = O.id OR T.collaboration_organization_id = O.id
WHERE T.collaboration_organization_id = O.id OR O.id = T.organization_id
GROUP BY O.id;

http://www.sqlfiddle.com/#!2/ee557/15

于 2013-01-16T23:01:14.110 に答える