このためには、group by
を行います。
chart_numとにアクセスしてください。同じchart_numとvisitを持つ行はすべて、結果に単一の行として表示されます。次に、 sum
受け取った金額。これにより、グループのすべての値が合計されます。
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
問題です。 group by
の一部ではないため、表示できません。 。これは文字列であるため、sum
などの関数で集計しても意味がありません。 またはcount
。データではchart_numは同じchart_nameを持っていますが、それは保証されていません。
1つの解決策は、 group_concat
を使用することです。
グループ内の各名前を連結します。グループごとに名前は1つだけにする必要があります。
select
chart_num,
visit,
group_concat(chart_name) as chart_name,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
ただし、適切な解決策はスキーマを修正することです。 chart_nameが重複しているため、これは避けてください。代わりに、グラフの列を独自のテーブルに移動します。次に、チャート名を取得するには、chart_numに参加します。
create table charts (
id serial primary key,
name varchar(255) not null
);
insert into charts (id, name) values
(4, 'user1'), (5, 'user2'), (6, 'user3'), (7, 'user4');
alter table table1 drop column chart_name;
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received
from table1
join charts on charts.id = chart_num
group by chart_num, visit
card_dateとvisitを一致させる2番目のテーブルとの左結合が必要です。 左結合とは、「左」テーブルのすべての行を意味します(つまり、from
table)は、結合テーブルに一致するものがない場合でも常に表示されます
。
訪問は日付です。 card_dateは日付ではなく、タイムスタンプです。それらを一致させるには、card_date
を変換する必要があります 日付に。
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received,
table2.card_date,
table2.advanced_amount as amount
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit
Advanced_amountとsum(card_amount_received)を比較する必要があります。それらが等しい場合:わかりました。そうでない場合:エラー。標準SQLでは、case
を使用します。
、ただし、MariaDBには非標準の if
それははるかにコンパクトです。
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received,
table2.card_date,
table2.advanced_amount as amount,
if(table2.advanced_amount = sum(card_amount_received), 'ok', 'error') as result
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit