执行动态数据透视表MySQL时出错

时间:2019-01-24 03:13:02

标签: mysql pivot-table

我有一个要创建动态数据透视表的表。

> NAMA_LOKASI| NAMA_MODEL | JUMLAH 
    IT       | Core_2_Duo | 20 
    IT       |Core_i3_2100| 5 
    HRD      | Core_2_Duo | 10 
    HRD      |Core_i3_2100| 10 
    ....

我想让桌子像这样:

>   NAMA_LOKASI| Core_2_Duo | Core_i3_2100 | ....
         IT    |     20     |      5       | ......
         HRD   |     10     |      10      | ......

         ....

这是我的查询

    SET @sql_dinamis = (
    select 
        GROUP_CONCAT( DISTINCT
            CONCAT ('SUM (IF(NAMA_MODEL = '
            ,NAMA_MODEL
            ,',JUMLAH,0)) AS '
            , NAMA_MODEL
            )
        )
        from v_barang2
    );

   SET @SQL = CONCAT('SELECT nama_lokasi, ', 
              @sql_dinamis, ' 
           FROM v_barang2 

           GROUP BY nama_lokasi WITH ROLLUP'
       );


PREPARE TEST FROM @SQL;
EXECUTE TEST;
DEALLOCATE PREPARE TEST;

但是当我执行查询时,它会显示此对话框

  

您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册以获取在'FROM v_barang2附近使用的正确语法              第2行的GROUP BY nama_lokasi WITH ROLLUP'

我使用phpMyAdmin版本4.8.4。请提供解决方案

1 个答案:

答案 0 :(得分:0)

检查sql语句的有效性真的很容易-只需在2个set语句后放置一个select,然后复制并粘贴结果并运行即可。在这种情况下,您会发现1个确定的错误和1个可能的错误。明确的错误是由sum和(之间的空格引起的,如果nama_model是数字,则可能会发生错误-您不能使用以数字开头或仅由数字组成的别名。

SET @sql_dinamis = (
    select 
        GROUP_CONCAT( DISTINCT
            CONCAT ('SUM(IF(NAMA_MODEL = '
            ,NAMA_MODEL
            ,',JUMLAH,0)) AS '
            , char(39),nama_model,char(39)
            )
        )
        from v_barang2
    );

   SET @SQL = CONCAT('SELECT nama_lokasi, ', 
              @sql_dinamis, ' 
           FROM v_barang2 

           GROUP BY nama_lokasi WITH ROLLUP'
       );


   SET @SQL = CONCAT('SELECT nama_lokasi, ', 
              @sql_dinamis, ' 
           FROM v_barang2 

           GROUP BY nama_lokasi WITH ROLLUP'
       );

产生这个

SELECT nama_lokasi, SUM(IF(NAMA_MODEL = 1,JUMLAH,0)) AS '1',
SUM(IF(NAMA_MODEL = 2,JUMLAH,0)) AS '2' 
FROM v_barang2 
GROUP BY nama_lokasi WITH ROLLUP

与此相对应的

drop table if exists v_barang2;          
Create table v_barang2(nama_lokasi int , nama_model int, jumlah int);
insert into v_barang2 values(1,1,1),(1,2,1),(2,1,1);

产生

+-------------+------+------+
| nama_lokasi | 1    | 2    |
+-------------+------+------+
|           1 |    1 |    1 |
|           2 |    1 |    0 |
|        NULL |    2 |    1 |
+-------------+------+------+
3 rows in set (0.00 sec)

请注意,最好是在发布问题时提供示例数据,而不是让我从大量无法正常工作的代码中猜测合适的数据。