我有两个表,数据和agentdata。
data (agentid, SimCardNumber, ProductName, Agentemail)
agentdata (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
答案 0 :(得分: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
这种查询可以快速检查数据,但是您的前端应该使用更可靠的查询并在那里构建表。
答案 1 :(得分:0)
data (agentid, SimCardNumber, ProductName, Agentemail)
agentdata (id, agentid, ProductName)
你应该真正考虑你的桌面布局。如果agentid == agentid
和ProductName == ProductName
,此布局将反对规范化数据库将存储的所有内容 - 因此不存在实际可能存在的查询...
1:1
关系吗? (一个代理,一个产品):那么你根本不需要agentdata-table。1:n
关系吗? (One Agent,multipe Products):那么您不需要数据表中的ProductName
。n:1
关系吗? (多个代理,一个产品):那么您不需要agentdata-table中的agentid
。n:n
关系吗? (多个代理,多个产品):然后,您需要从数据表中删除ProductName
,从agentdata-table中删除agentid
并创建一个带有ProductName
和{{1}的映射表你最终可以加入你的data- and agentdata-table。有了这种布局 - 并且不知道将数据存储在哪里,就不可能给出真正帮助解决问题的答案。