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

プリペアドステートメントを使用した複雑なmysqlクエリの問題

    • プリペアドステートメントに変数を含めるために、文字列の連結を使用しました。 STR_TABLE_NAMEのため、クエリでエラーが発生します テーブル名として扱われ、何も見つかりません。
    • 入力パラメータから( `)バッククォートを削除します。
    BEGIN
    
        DECLARE STR_TABLE_NAME VARCHAR(100) DEFAULT NULL;
        SELECT table_source INTO STR_TABLE_NAME FROM list_repository WHERE id = int_id LIMIT 1;
    
        DROP TABLE IF EXISTS `loyaltytry`;
    
        SET @prep_stmt = CONCAT('CREATE TABLE `loyaltytry` AS (
                                            SELECT 
                                                Months AS MONTH, 
                                                Number_of_New_Customers AS `new_customers`, 
                                                `Number_of_Repeat_Customers` AS `repeat_customers`
                                            FROM (
                                                SELECT 
                                                    MONTHNAME(Months) AS Months, 
                                                    MONTH(Months) AS `Month_number`, 
                                                    SUM(CASE WHEN REP_COUNT = "no" THEN cnts END) AS `Number_of_New_Customers`, 
                                                    SUM(CASE WHEN REP_COUNT = "yes" THEN cnts END) AS `Number_of_Repeat_Customers`
                                                FROM (
                                                    SELECT 
                                                        months,
                                                        REP_COUNT, 
                                                        COUNT(*) AS cnts
                                                    FROM (
                                                        SELECT 
                                                            (date_commande_client) AS Months, 
                                                            numero, 
                                                            CASE WHEN cnt > 1 THEN "yes" ELSE "no" END AS REP_COUNT
                                                        FROM (
                                                            SELECT 
                                                                COUNT(*) AS cnt, 
                                                                date_commande_client, 
                                                                numero
                                                            FROM ',  STR_TABLE_NAME , 
                                                            ' WHERE YEAR(date_commande_client) = 2017 
                                                                AND intitule IN (
                                                                    SELECT 
                                                                        showroom_name
                                                                    FROM `showrooms`
                                                                    WHERE id_region= ', int_id , ' 
                                                                )
                                                            GROUP BY date_commande_client, numero
                                                        ) AS tmp
                                                    ) AS final
                                                    GROUP BY Months, REP_COUNT
                                                ) AS tmp1
                                                GROUP BY MONTHNAME(Months), MONTH(Months)
                                                ORDER BY Month_number) AS finalll
                                            )');
    
        PREPARE stmt FROM @prep_stmt; 
        EXECUTE stmt; 
        DEALLOCATE PREPARE stmt;
    
    END
    



    1. アイテムのすべての祖先を取得するSQL再帰クエリ

    2. Oracleでの再帰

    3. スプリングブートでtimeTableを更新しようとしてエラーが発生しました

    4. パラメータに複数の値がある場合にWHEREステートメントでCASEを使用する