簡體   English   中英

選擇兩個表之間的差異

[英]Select difference between two tables

我想列出四列,日期、小時計數、每日計數和兩個計數之間的差異。

我已經為兩個表使用了 union all,但是我得到了 2rows,如圖所示:

圖片

Select a.date, a.hour,b.daily,sum(a.hour-b.daily)
from (select date,count(*) hour,''daily 
From table a union all select '' hour,count(*) daily from table b) 
Group by date, daily, hourly..

請給我建議一個解決方案。

我看到提供的代碼使用UNION來實現輸出。 使用某種JOIN可以更好地實現這一點。

其結果是行的總數table_a由分組date從行的總數目中減去table_b由分組date

這段代碼未經測試,但應該很好地說明如何實現這一點:

SELECT  a.date,
        a.hour,
        ISNULL(b.daily, 0) AS daily,
        a.hour - ISNULL(b.daily) AS difference
  FROM  (
        SELECT  date,
                COUNT(*) AS hour
          FROM  table_a
          GROUP BY date
        ) a
    LEFT JOIN (
               SELECT  date,
                       COUNT(*) AS daily
                 FROM  table_b
                 GROUP BY date
               ) b ON b.date = a.date
  ORDER BY a.date;

這通過以下方式工作:

  1. 計算table_a每個日期的計數。
  2. 計算table_b每個日期的計數。
  3. table_a所有結果與table_a中匹配的結果連接table_b
  4. 輸出date 、來自table_ahour來自table_adaily (如果為NULL table_b 0)以及兩者之間的差異。

筆記:

  • 我已將table atable b重命名為table_atable_b 我認為這些不是實際的表名
  • 如果您只想要在兩個表中具有匹配date列的結果,則INNER JOIN可能更可取。 無論table_b是否有條目,使用LEFT JOIN都將返回table_a所有結果。
  • 我不相信date是一個允許的列名,但我已經按照 OP 給出的示例在代碼中復制了它。

你的方法沒問題。 您的group by列不正確:

Select date, sum(hourly) as hourly, sum(daily) as daily,
       sum(hourly) - sum(daily) as diff
from ((select date, count(*) as hourly, 0 as daily 
       from table a
       group by date
      ) union all
      (select date, 0 as hourly, count(*) as daily
       from table b
       group by date
      ) 
     ) ab
group by date;

關鍵思想是外部查詢僅按date聚合——而且您仍然需要那里的聚合函數。

您的子查詢中還有其他錯誤,例如缺少group by s 和date列。 我假設那些是轉錄錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM