実際に開発したプロジェクトの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がすべての行で同じ値を持つ唯一のエラーで動作します...
ありがとうございます。
編集:
フィドル今働いたが、結果は次のようになります。
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
あなたはsqlfiddle –
サイドノートでこれを更新してくださいすることができます数値フィールドです。これは、データベースが暗黙の変換を行うため、パフォーマンスが低下します。 –
ありがとうジョージ、私はクエリを修正しました。 –