2017-12-19 40 views
1

実際に開発したプロジェクトのMySQLクエリに関する問題を解決する必要があります。SUM GROUP BY複数のテーブルを使ったサブクエリ

可能であれば、複数のテーブルでMySQL結果を取得したいと考えています。サブクエリを試しましたが、成功しませんでした。ここでDB構造です:

ユーザーを結ぶ

CREATE TABLE t_meeting 
(
meeting_n    INT AUTO_INCREMENT    PRIMARY KEY, 
meeting_user_n   INT       NOT NULL, 
meeting_gremium_n  INT       NOT NULL, 
meeting_gremium_f_n  VARCHAR(100)     NOT NULL, 
meeting_pay_flat  INT       NULL, 
meeting_no_pay   INT       NULL, 
meeting_pay_methode  INT       NULL, 
meeting_pay    INT       NULL, 
meeting_date   DATE       NULL, 
meeting_date_to   DATE       NULL, 
meeting_prepare   TIME       NULL, 
meeting_duration  TIME       NULL, 
meeting_allowance  DECIMAL(9, 2)    NULL, 
meeting_expences  DECIMAL(9, 2)    NULL, 
meeting_ahv    INT       NULL 
) 

CREATE TABLE t_meeting_pay 
(
meeting_pay_n   INT AUTO_INCREMENT PRIMARY KEY, 
meeting_pay_user_n  INT       NOT NULL, 
meeting_pay_date   DATE       NULL, 
meeting_pay_paiment_date DATE       NULL, 
meeting_pay_pay_for  INT       NOT NULL, 
meeting_pay_amount  DECIMAL(9, 2) DEFAULT '0.00' NULL, 
meeting_pay_meeting_n INT       NOT NULL 
) 

CREATE TABLE t_user_pay 
(
user_pay_n  INT AUTO_INCREMENT PRIMARY KEY, 
user_pay_user_n INT   NOT NULL, 
user_pay_date DATE   NULL, 
user_pay_amount DECIMAL(9, 2) NOT NULL, 
user_pay_year INT(4)  NOT NULL #<- Container the year of the meeting_date field 
) 

CREATE TABLE t_gremium 
(
gremium_n   INT AUTO_INCREMENT PRIMARY KEY, 
gremium_name  VARCHAR(250) NULL, 
gremium_name_short VARCHAR(50)  NULL, 
gremium_address VARCHAR(250) NULL, 
gremium_zip  INT(5)   NULL, 
gremium_city  VARCHAR(100) NULL, 
gremium_sector  INT    NULL, 
gremium_branch  INT    NULL, 
gremium_lvl  INT    NULL, 
gremium_ask  INT DEFAULT '0' NULL, 
gremium_ask_usern INT    NOT NULL 
) 

CREATE TABLE t_pay_for 
(
pay_for_n INT AUTO_INCREMENT PRIMARY KEY, 
pay_for_de VARCHAR(40) NOT NULL, 
pay_for_fr VARCHAR(40) NOT NULL, 
pay_for_it VARCHAR(40) NOT NULL 
) 

表はGremiumに属しミーティングがあります

t_meeting.meeting_user_nを - > t_user.user_n t_meeting.meeting_gremium_n - > t_gremium.gremium_n

会計従業員は、Gremiumから支払いが入ると、t_meeting_pay行を挿入できます。

t_meeting_pay.meeting_pay_meeting_n - > t_meeting.meeting_n

すべての従業員がミーティングを持っています。彼らのために、彼らは費用のための手当とお金を得る。このお金は社会に行きます。このすべてのお金から、従業員は最大1000 $を得る。額は1年あたりです。したがって、今年の7月に1000ドルに達すると、社会は1000ドルを従業員に支払う。達していない場合、年末に従業員は社会に支払われた金額、たとえば600 $を受け取る。

User | Year | Payed allowance | Payed expenses | Payed to user 
John | 2017 |   500.00 |   200.00 |  700.00 
John | 2018 |   400.00 |   150.00 |   0.00 

払っ手当= SUM(t_meeting_pay)t_meeting_pay_pay_for =年(t_meeting.meeting_date)BY 1 GROUP

今、私は、次の行を返すSQLクエリを作成したいです支払済み経費= SUM(t_meeting_pay)WHERE t_meeting_pay_pay_for = 2 GROUP年(t_meeting.meeting_date)

ユーザーに支払われる:SUM(t_user_pay)GROUP BY year(t_meeting.meeting_date)

だから、最終的な結果が同じテーブルからではなく、異なると2 SUMが含まれている必要がありWHERE年ごとにグループ化された条件、年およびユーザーデータでグループ化された別のテーブルからSUM。

私が作成したクエリ:

SELECT SUM(meeting_pay_amount) AS total, YEAR(meeting_date) AS year, 
(
    SELECT SUM(user_pay_amount) AS payed 
    FROM t_user_pay 
    WHERE user_pay_year = YEAR(meeting_date) 
    GROUP BY user_pay_year 
) AS total_payed, 
(
    SELECT SUM(meeting_pay_amount) AS payed 
    FROM t_meeting_pay 
    WHERE (1) AND meeting_pay_pay_for = 1 
    GROUP BY YEAR(meeting_date) 
) AS total_payed_a, 
(
    SELECT SUM(meeting_pay_amount) AS payed 
    FROM t_meeting_pay 
    WHERE (1) AND meeting_pay_pay_for = 2 
    GROUP BY YEAR(meeting_date) 
) AS total_payed_e, user_lname 
FROM t_meeting_pay 
LEFT JOIN t_meeting ON t_meeting_pay.meeting_pay_meeting_n = t_meeting.meeting_n 
LEFT JOIN t_user ON t_meeting.meeting_user_n = t_user.user_n 
LEFT JOIN t_user_pay ON t_user.user_n = t_user_pay.user_pay_user_n 
LEFT JOIN t_gremium ON t_meeting.meeting_gremium_n = t_gremium.gremium_n 
LEFT JOIN t_pay_for ON t_meeting_pay.meeting_pay_pay_for = t_pay_for.pay_for_n 
WHERE meeting_pay_user_n = 1 
GROUP BY year 

私は誰かが私を助けることができると思います。このクエリは、total_payed_aとtotal_payed_eがすべての行で同じ値を持つ唯一のエラーで動作します...

ありがとうございます。

編集:

SQLFiddle link

フィドル今働いたが、結果は次のようになります。

total | year | total_payed | total_payed_a | total_payed_e | user_lname 
1600 | 2017 |  500.00 |  600.00 |  300.00 |  Dee 
800 | 2018 |  300.00 |  1000.00 |  500.00 |  Dee 
+0

あなたはsqlfiddle –

+0

サイドノートでこれを更新してくださいすることができます数値フィールドです。これは、データベースが暗黙の変換を行うため、パフォーマンスが低下します。 –

+0

ありがとうジョージ、私はクエリを修正しました。 –

答えて

1

多くの作業の後arroundの、私が期待される結果を返すクエリを得ました。

New SQLFiddle

問合せ:それはこのクエリは、より効率的にすることが可能かどう

SELECT user_ma, user_lname, user_fname, 
    YEAR(meeting_date) AS meeting_year, 
    (
    SELECT SUM(user_pay_amount) AS payed 
    FROM t_user_pay 
    WHERE user_pay_year = YEAR(meeting_date) 
    GROUP BY user_pay_year 
    ) AS total_payed_to_user, 
    (
    SELECT SUM(meeting_pay_amount) 
    FROM t_meeting_pay 
    LEFT JOIN t_meeting ON t_meeting_pay.meeting_pay_meeting_n = t_meeting.meeting_n 
    WHERE meeting_pay_pay_for = '1' AND YEAR(meeting_date) = meeting_year 
    ) AS total_payed_a, 
    (
    SELECT SUM(meeting_pay_amount) 
    FROM t_meeting_pay 
    LEFT JOIN t_meeting ON t_meeting_pay.meeting_pay_meeting_n = t_meeting.meeting_n 
    WHERE meeting_pay_pay_for = '2' AND YEAR(meeting_date) = meeting_year 
    ) AS total_payed_e, 
    (
    SELECT SUM(meeting_pay_amount) 
    FROM t_meeting_pay 
    LEFT JOIN t_meeting ON t_meeting_pay.meeting_pay_meeting_n = t_meeting.meeting_n 
    WHERE YEAR(meeting_date) = meeting_year 
    ) AS total_payed 
    FROM t_meeting_pay 
    LEFT JOIN t_meeting ON t_meeting_pay.meeting_pay_meeting_n = t_meeting.meeting_n 
    LEFT JOIN t_user ON t_meeting.meeting_user_n = t_user.user_n 
    LEFT JOIN t_user_pay ON t_user.user_n = t_user_pay.user_pay_user_n 
    LEFT JOIN t_gremium ON t_meeting.meeting_gremium_n = t_gremium.gremium_n 
    LEFT JOIN t_pay_for ON t_meeting_pay.meeting_pay_pay_for = t_pay_for.pay_for_n 
    WHERE meeting_pay_user_n = 1 
    GROUP BY meeting_year 

誰かが私に言うことはできますか?

ご意見ありがとうございます。 『(1)』は不要とも以来、単一引用符の必要がない2'` `(1)AND meeting_pay_pay_for =」:

イヴ

関連する問題