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;
您应该创建一个存储过程,将所需的值存储在另一个表中 只是一些提示,在存储过程中,您应该(按顺序):
如果你不知道如何创建一个过程,你可以看看-->这里我认为根据你的查询结果,你不能有一个动态的列数。这就是为什么我建议这样做:
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的想法。我在那里添加了一个。