我有一个要创建动态数据透视表的表。
> 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。请提供解决方案
答案 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)
请注意,最好是在发布问题时提供示例数据,而不是让我从大量无法正常工作的代码中猜测合适的数据。