[英]Query from multiple table in MySQL and sum up
我有七個表(從 XT1 到 XT7),每個表的結構如下:
日期 | 米1 | 平方米 | 立方米 |
---|---|---|---|
2021-06-01 | 4 | 2 | 6 |
2021-06-02 | 3 | 2 | 5 |
2021-06-03 | 12 | 2 | 14 |
..... | .. | .. | .. |
我只需要每個表的 m3 值。 我想要做的是在一個表中顯示所有 m3 值並將它們總結如下:
日期 | XT1.m3 | XT2.m3 | XT3.m3 | XT4.m3 | XT5.m3 | XT6.m3 | XT7.m3 | 小計 XT1~7.m3 |
---|---|---|---|---|---|---|---|---|
2021-06-01 | 6 | 7 | 8 | 6 | 7 | 8 | 8 | 50 |
2021-06-02 | 6 | 7 | 8 | 6 | 7 | 8 | 8 | 50 |
2021-06-03 | 6 | 7 | 8 | 6 | 7 | 8 | 8 | 50 |
全部的 | 18 | 21 | 24 | 18 | 21 | 24 | 24 | 150 |
我之前嘗試過的:
select (TX1.m3+TX2.m3+TX3.m3...) AS subtotal, date_format(date, '%Y-%m') as date,TX1.m3,TX2.m3,TX3.m3
from TX1 AS c1 left join TX2 AS c2 on TX1.date=TX2.date
left join TX3 AS c3 on TX2.date=TX3.date
這是從以前的工作腳本修改而來的。 但是舊的結構只有 3 張桌子,現在我有 7 張。
更新:嘗試了以下操作
SELECT TX1.date,TX1.m3,TX2.m3,TX2.m3...TX7.m3
FROM TX1
inner JOIN TX2 ON TX1.date = TX2.date
inner JOIN TX3 ON TX2.date = TX3.date
......
inner JOIN TX7 ON TX6.date = TX7.date
上面的代碼將返回一個未分組的矩陣。 試圖用“日期”分組並返回錯誤 1055。覆蓋
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
現在有效,但不確定這是否是正確的方法。 有任何想法嗎?
如果您想使用相同的查詢結構添加新創建的表,您可以嘗試使用准備好的語句。 例如:
准備字段值:
/*setting variables as NULL*/
SET @sql = NULL;
SET @tbl = NULL;
SET @val1 = NULL;
SET @val2 = NULL;
SET @reftbl = 'TX1'; /*this is your reference (most left) table in the LEFT JOIN*/
/*setting each variables with values*/
SELECT GROUP_CONCAT(CONCAT(table_name,'.',column_name,' AS ',table_name,column_name) SEPARATOR ', ') INTO @val1
FROM information_schema.columns
WHERE table_name LIKE 'TX%'
#AND table_schema=your_database_name
AND column_name='m3';
SELECT CONCAT(GROUP_CONCAT(CONCAT(table_name,'.',column_name) ORDER BY table_name SEPARATOR '+' ),' as subtotal') INTO @val2
FROM information_schema.columns
WHERE table_name LIKE 'TX%'
#AND table_schema=your_database_name
AND column_name='m3'
這里我們使用information_schema.columns
表來生成來自與條件( table_name
和table_schema
)對應的所有表的所有m3
列的字段。 這將返回給你類似的東西:
@val1: TX1.m3 AS TX1m3, TX2.m3 AS TX2m3, TX3.m3 AS TX3m3, TX4.m3 AS TX4m3, TX5.m3 AS TX5m3, TX6.m3 AS TX6m3, TX7.m3 AS TX7m3
@val2:TX1.m3+TX2.m3+TX3.m3+TX4.m3+TX5.m3+TX6.m3+TX7.m3 as subtotal
接下來是准備查詢所需的表並添加LEFT JOIN
。
SELECT CONCAT(@reftbl,
GROUP_CONCAT(
CASE WHEN tbn IS NOT NULL
THEN CONCAT(' LEFT JOIN ', table_name,' ON ',tbn,'.date =',table_name,'.date')
ELSE table_name END SEPARATOR ' ')) INTO @tbl
FROM
(SELECT @reftbl tbn,
table_name
FROM information_schema.tables
WHERE table_name LIKE 'TX%'
#AND table_schema=your_database_name
AND table_name <> @reftbl) v;
我在這里做的操作是使用CONCAT
和GROUP_CONCAT
生成LEFT JOIN
部分。
然后我們使用基於我們之前設置的所有變量生成的查詢來設置@sql
變量; 使用CONCAT
構建。
/*constructing query and set into @sql*/
SET @sql = CONCAT('SELECT DATE_FORMAT(TX1.DATE, "%Y-%m") AS DATE,',@val1,',',@val2,'
FROM ',@tbl,';');
這將最終得到如下查詢:
SELECT DATE_FORMAT(TX1.DATE, "%Y-%m") AS DATE,TX1.m3 AS TX1m3, TX2.m3 AS TX2m3,
TX3.m3 AS TX3m3, TX4.m3 AS TX4m3, TX5.m3 AS TX5m3, TX6.m3 AS TX6m3, TX7.m3 AS TX7m3,
TX1.m3+TX2.m3+TX3.m3+TX4.m3+TX5.m3+TX6.m3+TX7.m3 as subtotal
FROM TX1 LEFT JOIN TX2 ON TX1.date =TX2.date
LEFT JOIN TX3 ON TX1.date =TX3.date
LEFT JOIN TX4 ON TX1.date =TX4.date
LEFT JOIN TX5 ON TX1.date =TX5.date
LEFT JOIN TX6 ON TX1.date =TX6.date
LEFT JOIN TX7 ON TX1.date =TX7.date;
最后,准備、執行然后釋放@sql
語句,您將獲得所需的結果:
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
這是一種生成“動態查詢”的方法,這意味着如果/當您添加/刪除表時,將生成帶有附加表或不帶已刪除表的查詢。 例如,如果有一個新表TX8
,當您運行上面的查詢時,只要它與條件匹配,它就會在准備好的語句中包含TX8
。
這是一個演示小提琴,其中包括創建新表時的情況。
在另一個數據庫中,這個問題可以通過多個FULL
連接來解決,但由於 MySql 不支持它們並且不能為 7 個表模擬它們,我會選擇UNION ALL
。
從每個表中,返回 8 列:1 列表示日期,1 列表示m3
和 6 個null
列。
使用UNION ALL
組合它們並最終聚合:
SELECT date,
MAX(m3_1) m3_1, MAX(m3_2) m3_2, MAX(m3_3) m3_3, MAX(m3_4) m3_4, MAX(m3_5) m3_5, MAX(m3_6) m3_6, MAX(m3_7) m3_7,
COALECSE(MAX(m3_1), 0) + COALECSE(MAX(m3_2), 0) + COALECSE(MAX(m3_3), 0) + COALECSE(MAX(m3_4), 0) +
COALECSE(MAX(m3_5), 0) + COALECSE(MAX(m3_6), 0) + COALECSE(MAX(m3_7), 0) subtotal
FROM (
SELECT date, m3 m3_1, null m3_2, null m3_3, null m3_4, null m3_5, null m3_6, null m3_7 FROM XT1
UNION ALL
SELECT date, null, m3, null, null, null, null, null FROM XT2
UNION ALL
SELECT date, null, null, m3, null, null, null, null FROM XT3
UNION ALL
............................................................
SELECT date, null, null, null, null, null, null, m3 FROM XT7
) t
GROUP BY date
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.