0

我有两个表,数据和代理数据。

data (agentid, SimCardNumber, ProductName, Agentemail)

代理数据(id, agentid, ProductName)

目前我只处理两种产品,我想通过agentemail查看这个列表

agentemail    |  Product1  |  Total1   |  Product2  |  Total2
-----------------------------------------------------------
abc@gmail.com |  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
4

2 回答 2

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

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

于 2013-08-18T15:16:56.243 回答
0
data (agentid, SimCardNumber, ProductName, Agentemail)

agentdata (id, agentid, ProductName)

您应该真正考虑一下您的表格布局。如果agentid == agentidProductName == ProductName,则此布局与规范化数据库将存储的所有内容背道而驰-因此,不可能进行真正有意义的查询...

  • 你想要1:1关系吗?(一个代理,一个产品):那么您根本不需要代理数据表。
  • 你想要1:n关系吗?(一个代理,多个产品):那么您不需要ProductName数据表中的 。
  • 你想要n:1关系吗?(多个代理,一种产品):那么您不需要agentid代理数据表中的 。
  • 你想要n:n关系吗?(多个代理,多个产品):然后您需要ProductName从数据表中删除agentid,从代理数据表中删除并创建一个映射表ProductNameagentid您最终可以在该表上加入您的数据和代理数据表。

使用这种布局 - 在不知道哪些数据存储在哪里的情况下,不可能给出真正帮助您解决问题的答案。

于 2013-09-11T23:49:38.430 回答