【问题标题】:Dynamical pivot table change row to column动态数据透视表将行更改为列
【发布时间】:2016-03-16 06:08:48
【问题描述】:

我有架构:
See SQL Fiddle with Demo


但我想使用户名列的动态数量.. 我试过这个查询

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT(
            'sum(case when nama = ''', nama, ''' then count else 0 end) AS ',
            replace(nama,'','')
            )
        )INTO @sql
 from (SELECT 
DATE_FORMAT(a.datetime,"%m-%Y") as bulan,
b.nm_user as nama, 
count(a.kd_user) as count
FROM tbl_log_login a, tbl_user b  where a.kd_user=b.id 
group by a.kd_user, DATE_FORMAT(a.datetime,"%m-%Y") order by a.datetime) c;

SET @sql = CONCAT('SELECT bulan, ',@sql, ' from (SELECT 
DATE_FORMAT(a.datetime,"%m-%Y") as bulan,
b.nm_user as nama, 
count(a.kd_user) as count
FROM tbl_log_login a, tbl_user b  where a.kd_user=b.id 
group by a.kd_user, DATE_FORMAT(a.datetime,"%m-%Y") order by a.datetime) c 
group by bulan');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


但没有任何意见,可能该查询是错误的.. 帮助,谢谢..

【问题讨论】:

  • 尝试在第一次选择后打印您的 @sql 变量,看看里面有什么。
  • 可能是您将结果分配给@sql 变量,其中结果包含多于一行
  • 对不起,你可以试试linkSQL Fiddle with Demo 非常感谢..

标签: mysql


【解决方案1】:

试试这个:

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT(
            'sum(case when nama = ''', nama, ''' then count else 0 end) AS ',
            replace(nama,' ','_')
            )
        )INTO @sql
 from (SELECT 
DATE_FORMAT(a.datetime,"%m-%Y") as bulan,
b.nm_user as nama, 
count(a.kd_user) as count
FROM tbl_log_login a, tbl_user b  where a.kd_user=b.id 
group by a.kd_user, DATE_FORMAT(a.datetime,"%m-%Y") order by a.datetime) c;

SET @sql = CONCAT('SELECT bulan, ',@sql, ' from (SELECT 
DATE_FORMAT(a.datetime,"%m-%Y") as bulan,
b.nm_user as nama, 
count(a.kd_user) as count
FROM tbl_log_login a, tbl_user b  where a.kd_user=b.id 
group by a.kd_user, DATE_FORMAT(a.datetime,"%m-%Y") order by a.datetime) c 
group by bulan');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

注意:您在列别名中有空格。除非用引号括起来,否则列别名中的空格将不起作用。在这种情况下,我用下划线替换了空格。

编辑:

SELECT @sql;

我得到了这个结果:

SELECT bulan, sum(case when nama = 'Reza' then count else 0 end) AS Reza,sum(case when nama = 'Super User' then count else 0 end) AS Super_User from (SELECT 
DATE_FORMAT(a.datetime,"%m-%Y") as bulan,
b.nm_user as nama, 
count(a.kd_user) as count
FROM tbl_log_login a, tbl_user b  where a.kd_user=b.id 
group by a.kd_user, DATE_FORMAT(a.datetime,"%m-%Y") order by a.datetime) c 
group by bulan;

单独执行这个查询我得到了以下结果:

bulan       Reza        Super_User
01-2016     1             1
02-2016     0             2
03-2016     0             2

快照:

【讨论】:

  • 但我得到了结果。请参阅我的回答中的 EDIT 部分。@YanuarIhsan
  • 是的,我已经执行了该查询,但我想制作动态数据透视表.. 我该怎么做?
  • 你已经让它动态化了。我所做的只是解决我之前提到的问题。@YanuarIhsan
  • 那个SQL查询已经执行成功了,为什么结果为空??
  • 我已经根据您在 sql fiddle 中给定的数据对此进行了模拟。如果您有相同的数据集,则无法获得空结果。@YanuarIhsan
猜你喜欢
  • 2017-07-30
  • 2016-03-27
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多