2013-08-18 142 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表。

通過這一佈局, - 並且不知道什麼數據存儲在何處,這是不可能給出答案的是真的幫助你與你的問題。

相關問題