sql >> データベース >  >> RDS >> Mysql

2つのテーブルを比較した後、一致を出力するにはどうすればよいですか?

    このためには、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
    



    1. Eclipseでサーブレットとjspを使用してデータベースにデータを挿入します

    2. 日付によるエントリの選択->=NOW()、MySQL

    3. 開発者向けの最高のデータベースソフトウェア(2022年版)

    4. SQLクエリからSparkデータフレームを作成する