簡體   English   中英

來自所有表的特定列的SUM值LIKE table_%

[英]SUM values of specific column from all tables LIKE table_%

我需要幫助來創建一個SQL查詢,以便對所有表(如table_%)中特定列的值求和,因為這些表會隨着時間增長,並且必須根據以下格式滿足新表名的需要


方案名稱: database_01

表名:tb_data_ 'YEAR '_' '


  • YEARMONTH均為從2011年到2018年的所有12個月和年中的值。

每個表都包含一個稱為TOTAL_VALUE的列。 我有一個php腳本,該腳本觸發SQL查詢以從數據庫中提取數據。

我想對每個表的總計TOTAL_VALUE列求和,並在下面保存我的腳本的值以推送數組。

$sql = "SELECT TOTAL_VALUES FROM tb_data_2017_october";   
$result = mysqli_query($conn, $sql);

$data = array(); while($enr = mysqli_fetch_assoc($result)){
    $a =  array($enr['TOTAL_VALUES']);
    foreach ($a as $as){
        echo "'".$as."', ";}
    array_push($data, $as); }

我一直在嘗試使用以下選項來更改SQL:

SELECT id FROM table1
    UNION
    SELECT id FROM table2
    UNION
    SELECT id FROM table3
    UNION
    SELECT id FROM table4

但是我需要照顧檢查所有類似於tb_data_%的表的能力

使用MERGE存儲引擎創建包含所有月度表的虛擬表。

CREATE TABLE tb_all_data (
    ...
) ENGINE=MERGE UNION=(tb_data_2017_october, tb_data_2017_november, ...);

列出UNION=列表中的所有表,並在創建新表時對其進行更新。

然后,您可以從tb_all_data查詢。

試試這個-它會以所需的模式遍歷所有表並為您創建總和:

declare @table table (rowid int identity, name varchar(max))
        insert @table
        select name from sys.tables where name like '%yourname%'

        declare @holding table (name varchar(max), sumvalue int)

        declare @iterator int = 1
        declare @tablename varchar(max)
        while @iterator<=(select max(rowid) from @table)
        begin
        select @tablename=name from @table where rowid=@iterator

        insert @holding
        exec('select '+@tablename+' sum(TOTAL_VALUE)TOTAL_VALUE from '+@tablename+' group by +'+@tablename+'')

        set @iterator=@iterator+1
        end 

    select * from @holding

有關獲取表列表的信息,請參見此問題: 在MySQL中使用SELECT語句獲取表名稱

您可以在一個查詢結果中獲得表列表,然后查詢每個表。 我將稍微修改您的代碼以舉一個例子:

// Get the tables
$tables_sql = "SELECT table_name 
                FROM information_schema.tables 
                WHERE table_schema='<your DB>' 
                AND table_name LIKE 'tb_data%'";  

$tables = mysqli_query($conn, $sql);

// Iterate over the tables
while($table = mysqli_fetch_assoc($tables)){
{
    /*
    * Your code
    */

    // This query assumes that you can trust your table names not to to an SQL injection
    $sql = "SELECT TOTAL_VALUES FROM " . $table['table_name']; 
    $result = mysqli_query($conn, $sql);

    $data = array(); while($enr = mysqli_fetch_assoc($result)){
        $a =  array($enr['TOTAL_VALUES']);
        foreach ($a as $as){
            echo "'".$as."', ";
        array_push($data, $as); }
}

擁有表列表后,您就可以執行所需的任何操作。 您可以構建一個大型聯合查詢(這比單獨查詢每個表效率更高),也可以將這些表提供給MERGE引擎,如barmar的回答

暫無
暫無

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

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