Mysql 用于提取嵌入php的数据的Sql查询

Mysql 用于提取嵌入php的数据的Sql查询,mysql,sql,select,group-by,sum,Mysql,Sql,Select,Group By,Sum,我的桌子:性能 -------------------------- Name | Year | Value | -------------------------- John | 1999 | 100 | -------------------------- Collin | 2000 | 125 | -------------------------- John | 2001 | 150 | --------------------------

我的桌子:性能

--------------------------
Name   |  Year |  Value  |
--------------------------
John   |  1999 |   100   |
--------------------------
Collin |  2000 |   125   |
--------------------------
John   |  2001 |   150   |
--------------------------
John   |  2000 |   100   |
--------------------------
John   |  2001 |   150   |
--------------------------
Collin |  2003 |   500   | 
--------------------------
我只想得到如下的o/p

-------------------------------------------
Name  |   1999   |  2000 |  2001  |  2003   |
-------------------------------------------
John  |   100    |  100  |  300   | (NULL)  |
-------------------------------------------
Collin|  (NULL)  |  125  | (NULL) |  500    |
-------------------------------------------
更多信息:John在2003年表现不佳,因此其值为
NULL
n,依此类推。各年的n值相加。 我不想对上面的pbm进行sql查询,我用php.treate作为简单的sql查询完成了所有连接

Thanx..

试试这个:

SELECT p.Name, 
       SUM(IF(p.year = 1999, p.value, 0)) AS `1999`, 
       SUM(IF(p.year = 2000, p.value, 0)) AS `2000`, 
       SUM(IF(p.year = 2001, p.value, 0)) AS `2001`, 
       SUM(IF(p.year = 2003, p.value, 0)) AS `2003`
FROM performance p 
GROUP BY p.Name;

您应该创建一个存储过程,将所需的值存储在另一个表中

只是一些提示,在存储过程中,您应该(按顺序):

  • 将所有年份连接为变量中的字符串
  • 使用此变量创建表
  • 用光标在原始表上循环,并递增select用户的列
  • 过程调用后,只需选择所创建表的所有值

  • 如果你不知道如何创建一个过程,你可以看看-->这里我认为根据你的查询结果,你不能有一个动态的列数。这就是为什么我建议这样做:

    Name    Year    Sum
    Collin  1999    (NULL)
    Collin  2000    125
    Collin  2001    (NULL)
    Collin  2003    500
    John    1999    100
    John    2000    100
    John    2001    300
    John    2003    (NULL)
    
    您可以使用“分组方式”执行此操作。要获取空值,请在表中的所有名称和所有年份之间使用交叉联接

    SELECT performance_names.Name, performance_years.Year, SUM(p.Value) AS Sum
    FROM
    (SELECT DISTINCT P.Name
    FROM performance AS P) AS performance_names
    CROSS JOIN
    (SELECT DISTINCT P.Year
    FROM performance AS P) AS performance_years
    LEFT JOIN performance AS p
    ON performance_names.`Name` = p.`Name` AND p.`Year` = performance_years.`Year`
    GROUP BY performance_names.`Name`, performance_years.`Year`
    

    写一个存储过程来得到结果还有更多的年份吗?是的,实际上它是未定义的任何年份n任何名称的数量,所以一般来说,比XX更好的解决方案如果只有这些年份的话,那就完美了。(或者如果DB中的年份是固定的)@user3172177有什么问题?@SaharshShah如果你得到2002年会发生什么?还是2013年?这不管用。(除非您每年重新制作选择,并且每次新年收入时都对其进行修改)@vipul。你的解决方案的o/p:AB,,dats it.。如果这是你想要的,那么你必须在查询中手动添加你想要/可能有的年份(比如1900到2200),但这将导致一个巨大的查询。这是我看到的唯一解决办法。我建议您使用任何编程语言编写一些代码来自动生成查询。例如,运行此php将提供以下查询:$s=“SELECT p.Name,”;对于($i=1900;$i)这是得到输出值,但格式是成行的吗?他问(如果他知道他不知道什么的话)以列的形式得到它们。是的,甜瓜。但他问的不是mysql。这就是为什么我建议一些更简单的方法,也许可以满足他的需要。这是绝对正确的。我只是想注意一个可能的差异(对于未来的访问者),但您的代码运行得很好。@mimarcel:names cnt b重复,jst需要两个名称n它们在相应年份的值..dats wat i want.n即使在que中我提到了dat wat o/p i want..@user3172177如果这是您想要的,那么使用Saharsh Shah的想法。我在那里添加了一个。