[英]MySQL: Query from multiple tables
我有一個數據庫 MySQL 8.0,有 12 個表(每個月一個),其中包含有關客戶的信息。 所有表格都有一個客戶 ID 和他們節省的金額。 例如,兩個月:
+------------------+
+ January +
+------------------+
+ ClienID | Amount +
+------------------+
+ qwer23 | 23 +
+------------------+
+ December +
+------------------+
+ ClienID | Amount +
+------------------+
+ qwer23 | 15 +
我想得到一張帶有ClientID和每月金額的表格。 像這樣
+------------------+----------------+----------+
+ ClienID | January| | December |
+------------------+----------------+----------+
+ qwer23 | 23 | | 15 |
我搜索了一些選項,但我不確定如何使用 JOIN 或 GROUP+BY。
我有一個數據庫 MySQL 8.0 有 12 個表(每個月一個)
我認為這不是一個好的數據庫設計,您不應該將月份存儲在不同的表中。
對於給定的數據,一種方法是在所有月份都使用 union,請嘗試:
select ClienID,
max(January) as January,
max(Febrary) as Febrary,
max(December) as December
from (
select ClienID,amount as 'January',null as 'Febrary', null as 'December'
from January
union
select ClienID,null as 'January',null as 'Febrary',amount as 'December'
from December
) as months_tbl
group by ClienID;
這僅簡化了 3 個月,您需要為每個月添加一個 union 子句,並且上述查詢為每個不同的 ClienID 考慮了一個值。
完整的查詢如下:
select ClienID,
max(January) as January,
max(Febrary) as Febrary,
max(March) as March,
max(April) as April,
max(May) as May,
max(June) as June,
max(July) as July,
max(August) as August,
max(September) as September,
max(October) as October,
max(November) as November,
max(December) as December
from (
select ClienID,amount as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
from January
union
select ClienID,null as 'January',amount as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
from February
union
select ClienID,null as 'January',null as 'February', amount as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
from March
union
select ClienID,null as 'January',null as 'February', null as 'March', amount as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
from April
union
select ClienID,null as 'January',null as 'February', null as 'March', null as 'April', amount as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
from May
union
select ClienID,null as 'January',null as 'February', null as 'March', null as 'April', null as 'May', amount as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
from June
union
select ClienID,null as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', amount as 'July', null as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
from July
union
select ClienID,null as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', amount as 'August', null as 'September', null as 'October', null as 'November', null as 'December'
from August
union
select ClienID,null as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', amount as 'September', null as 'October', null as 'November', null as 'December'
from September
union
select ClienID,null as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', amount as 'October', null as 'November', null as 'December'
from October
union
select ClienID,null as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', amount as 'November', null as 'December'
from November
union
select ClienID,null as 'January',null as 'February', null as 'March', null as 'April', null as 'May', null as 'June', null as 'July', null as 'August', null as 'September', null as 'October', null as 'November', amount as 'December'
from December
) as months_tbl
group by ClienID;
您在 12 個月中的每個月都有一個表,並且客戶在每個表中最多可以有一行。 要為每個客戶獲取所有每月金額的結果行,您需要完全外部連接客戶 ID 上的所有表。 然而,MySQL 仍然不支持完全外連接。
由於這些表有一個客戶端 ID,我假設這些 ID 鏈接到的還有一個客戶端表。 因此,只需 select 客戶表中的客戶和外部加入月份:
select
clientid,
january.amount as january,
february.amount as february,
...
december.amount as december
from client
left outer join january using (clientid)
left outer join february using (clientid)
...
left outer join december using (clientid);
如果您沒有客戶端表(這似乎不太可能),您可以通過替換來即時創建一個
from client
經過
from
(
select clientid from january union
select clientid from february union
...
select clientid from december
) client
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.