Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数据库中选择数据并在MYSQL中创建新列_Php_Mysql_Sql - Fatal编程技术网

Php 从数据库中选择数据并在MYSQL中创建新列

Php 从数据库中选择数据并在MYSQL中创建新列,php,mysql,sql,Php,Mysql,Sql,我有一个包含三列的表:countrycode、year和values。年份包括2000年、2001年和2002年。我需要选择特定年份的数据,并将其显示为新列 SELECT g.countrycode, g.values AS '2000' FROM `gainfinal` g WHERE `year` = '2000' 我使用了上面的查询,它返回了两列year和2000,其中列'2000'包含2000年的值。现在我需要选择2001年和2002年的其他年份的数据

我有一个包含三列的表:countrycode、year和values。年份包括2000年、2001年和2002年。我需要选择特定年份的数据,并将其显示为新列

    SELECT g.countrycode, g.values AS '2000'
      FROM `gainfinal` g 
     WHERE `year` = '2000' 

我使用了上面的查询,它返回了两列year和2000,其中列'2000'包含2000年的值。现在我需要选择2001年和2002年的其他年份的数据,并以类似的方式显示。如何在两年内再创建两个列

您将使用条件聚合。将聚合函数与CASE语句相结合

这是一个总结2000年到2003年之间的价值的例子

SELECT  g.countrycode,
        sum(case when `year` = '2000' then g.values else 0 end) AS "2000",
        sum(case when `year` = '2001' then g.values else 0 end) AS "2001",
        sum(case when `year` = '2002' then g.values else 0 end) AS "2002",
        sum(case when `year` = '2003' then g.values else 0 end) AS "2003"
FROM    `gainfinal` g
WHERE   `year` between '2000' and '2003'
group by g.countrycode
示例数据不包含年份为2002或2003的任何行。所以它们应该是零

如果需要2004年的数据,必须将2004年添加到WHERE子句的范围中,并将其CASE语句添加到SELECT列表中,如下所示

然而,2002年和2003年仍然是零,因为它们是零

SELECT  g.countrycode,
        sum(case when `year` = '2000' then g.values else 0 end) AS "2000",
        sum(case when `year` = '2001' then g.values else 0 end) AS "2001",
        sum(case when `year` = '2002' then g.values else 0 end) AS "2002",
        sum(case when `year` = '2003' then g.values else 0 end) AS "2003",
        sum(case when `year` = '2004' then g.values else 0 end) AS "2004"
FROM    `gainfinal` g
WHERE   `year` between '2000' and '2004'
group by g.countrycode
您必须指定年份范围,并在选择列表中为您希望输出的每一年指定一个案例陈述。对于要动态确定的列,没有纯sql解决方案。因此,在Excel中创建数据透视表可能会更好。以上假设您知道要提前显示数据的年份

所以,如果你想从1995年到2012年,你必须每年都有一份案例陈述,比如:

SELECT  g.countrycode,
        sum(case when `year` = '1995' then g.values else 0 end) AS "1995",
        sum(case when `year` = '1996' then g.values else 0 end) AS "1996",
        sum(case when `year` = '1997' then g.values else 0 end) AS "1997",
        sum(case when `year` = '1998' then g.values else 0 end) AS "1998",
        sum(case when `year` = '1999' then g.values else 0 end) AS "1999",
        sum(case when `year` = '2000' then g.values else 0 end) AS "2000",
        sum(case when `year` = '2001' then g.values else 0 end) AS "2001",
        sum(case when `year` = '2002' then g.values else 0 end) AS "2002",
        sum(case when `year` = '2003' then g.values else 0 end) AS "2003",
        sum(case when `year` = '2005' then g.values else 0 end) AS "2004",
        sum(case when `year` = '2006' then g.values else 0 end) AS "2005",
        sum(case when `year` = '2007' then g.values else 0 end) AS "2006",
        sum(case when `year` = '2008' then g.values else 0 end) AS "2007",
        sum(case when `year` = '2009' then g.values else 0 end) AS "2008",
        sum(case when `year` = '2010' then g.values else 0 end) AS "2009",
        sum(case when `year` = '2011' then g.values else 0 end) AS "2010",
        sum(case when `year` = '2012' then g.values else 0 end) AS "2011",
        sum(case when `year` = '2012' then g.values else 0 end) AS "2012"
FROM    `gainfinal` g
WHERE   `year` between '1995' and '2012'
group by g.countrycode

你期望的结果是什么?试试这一个选择g.countrycode,g.values AS year FROM gainfinal`g`我需要选择所有年份作为一个单独的列。我认为SQL缺少这种特性。仅使用纯SQL很难生成与预期完全相同的输出。如何获取行而不是列,并使用客户端应用程序将其转换为水平输出格式。