比方說,我有一個客戶的數據庫,他們購買對隨機對象「適用」的材料。例如,約翰購買了適用於汽車和房屋的「材料X」中的10美元。標準化,彙總和連接表問題
Customers
+----+-------+
| ID | Name |
+----+-------+
| 1 | John |
| 2 | Larry |
+----+-------+
Orders
+---------+------------+-------+----------+
| OrderID | CustomerID | Sales | Material |
+---------+------------+-------+----------+
| 1 | 1 | 10 | x |
| 2 | 1 | 15 | x |
| 3 | 1 | 6 | y |
| 4 | 2 | 3 | x |
| 5 | 2 | 25 | y |
+---------+------------+-------+----------+
我Materials
表原本看上去像這樣
+----------+-------------------------+
| Material | Applicability |
+----------+-------------------------+
| x | car, house, plane, bike |
| y | car, bike |
+----------+-------------------------+
當我需要顯示什麼材料約翰和購買的對象是材料適用於,我的查詢是這樣的。
Select ID, Name, sum(Sales), Material, Applicability
FROM Customers a
INNER JOIN Orders b on a.ID = b.CustomerID
INNER JOIN Materials c on b.Material = c.Material
WHERE Name = 'John'
GROUP BY ID, Name, Material, Applicability
結果
+----+------+--------------+----------+-------------------------+
| ID | Name | Total Sales | Material | Applicability |
+----+------+--------------+----------+-------------------------+
| 1 | John | 25 | x | car, house, plane, bike |
| 1 | John | 6 | y | car, bike |
+----+------+--------------+----------+-------------------------+
的逗號分隔值(我知道這違反了很多規則)很方便,因爲分析的適用性時,我可以簡單地劃分用逗號的字符串,然後我有一個列表適用性對象。
現在,它已經決定正常化Materials
表,所以現在它看起來像這樣
+----------+---------------+
| Material | Applicability |
+----------+---------------+
| x | car |
| x | house |
| x | plane |
| x | bike |
| y | car |
| y | bike |
+----------+---------------+
這正常化打亂了我現有的查詢,它會導致sum(sales)
結果是無論多少對象材料的多適用於。
例子。
+----+------+-------------+----------+---------------+
| ID | Name | Total Sales | Material | Applicability |
+----+------+-------------+----------+---------------+
| 1 | John | 25 | x | car |
| 1 | John | 25 | x | house |
| 1 | John | 25 | x | plane |
| 1 | John | 25 | x | bike |
| 1 | John | 6 | y | car |
| 1 | John | 6 | y | bike |
+----+------+-------------+----------+---------------+
現在看來約翰已經購買了100美元的材料x,當他真的只買了25美元。我需要顯示用戶John購買材料x以及x的適用性。
主要問題是當我需要找出John購買的東西時,還要根據適用性進行過濾。
Select ID, Name, sum(Sales), Material, Applicability
FROM Customers a
INNER JOIN Orders b on a.ID = b.CustomerID
INNER JOIN Materials c on b.Material = c.Material
WHERE Name = 'John' and (applicability = 'car' or applicability = 'bike')
GROUP BY ID, Name, Material, Applicability
如果任何材料同時適用於汽車和自行車,然後將總價值sum(sales)
將增加一倍。
我該如何處理這種重複?
請相應地標記您的數據庫。你想要的結果是什麼,和原來的一樣?如果是這樣,你想使用像'group_concat'這樣的行重新組合成一列... – sgeddes
添加了sql-server標籤。是的結果應該是相同的,唯一的區別是規格化的材料表。 –
Sql Server不支持'group_concat'。 SO有幾個例子,但是如何做到這一點。這有助於:http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-sql-server – sgeddes