2013-08-18 72 views
0

我有两个表,数据和agentdata。从1列中计数项并将它们拆分为两列

data (agentid, SimCardNumber, ProductName, Agentemail)

agentdata (id, agentid, ProductName)

目前我只涉及两款产品,我想通过agentemail

agentemail | Product1 | Total1 | Product2 | Total2 
----------------------------------------------------------- 
[email protected] | ball  | 5  | bat  | 0 

查看此列表组我尝试此查询,但我有问题,显示两个产品和它们并排。

SELECT a.agentid, d.Agentemail, a.ProductName, COUNT(a.ProductName) AS Total 
FROM data AS d, agentdata AS a 
WHERE d.agentid=a.agentid 
GROUP BY a.ProductName 

回答

0

SQL的构建并不是为了处理这种并排的事情。它适用于行,您希望它显示列。

您的原始查询应该GROUP BY agentid, ProductName将代理与产品总计分开。

如果您知道您只有两件产品,并且没有更多产品,您可以编写一个查询来并排显示这两种产品。如果你添加第三个产品,它不会包含它。

SELECT a.agentid, d.Agentemail, 
    'ball' AS Product1, 
    SUM(IF(a.ProductName = 'ball', 1, 0)) AS Total1, 
    'bat' AS Product2, 
    SUM(IF(a.ProductName = 'bat', 1, 0)) AS Total2, 
FROM data AS d, agentdata AS a 
WHERE d.agentid=a.agentid 
GROUP BY agentid 

这种查询对数据执行快速检查是可以的,但是您的前端应该使用更稳定的查询并在那里构建表。

0
data (agentid, SimCardNumber, ProductName, Agentemail) 

agentdata (id, agentid, ProductName) 

你应该真的考虑一下你的表格布局。如果agentid == agentidProductName == ProductName,这种布局是反对一切规范化的数据库将存储 - 因此没有疑问,实际上使SENCE是可能的...

  • 你想要一个1:1关系? (一个代理商,一个产品):那么你根本不需要agentdata-table。
  • 你想要1:n的关系吗? (One Agent,multipe Products):那么你不需要在数据表中使用ProductName
  • 你想要n:1的关系吗? (Multiple Agents,One Product):然后,您不需要agentdata-table中的agentid
  • 你想要n:n的关系吗? (Multiple Agents,Multiple Products):然后,您需要从数据表中删除ProductName,从agentdata-table删除agentid,然后创建一个映射表,并使用ProductNameagentid最终可以加入您的数据表和agentdata表。

通过这一布局, - 并且不知道什么数据存储在何处,这是不可能给出答案的是真的帮助你与你的问题。