2010-08-15 117 views
0

我的查詢:SQL GROUP BY和NULL值:如何將結果按非空值分組?

SELECT *, 
    contacts.createdAt AS contactcreatedAt, 
    contacts.updatedAt AS contactupdatedAt, 
    bidresponses.itemid AS bidresponseitemid, 
    bidresponses.personid AS bidresponsepersonid, 
    SUM(tagsitems.quantity) AS totalquantity 
FROM items 
LEFT OUTER JOIN tagsitems ON items.id = tagsitems.itemid 
LEFT OUTER JOIN itemscontacts ON items.id = itemscontacts.itemid 
LEFT OUTER JOIN contacts ON itemscontacts.contactid = contacts.id 
LEFT OUTER JOIN bidresponses ON items.id = bidresponses.itemid AND itemscontacts.personid = bidresponses.personid 
LEFT OUTER JOIN bidtemplatefields ON bidresponses.bidtemplatefieldid = bidtemplatefields.id 
WHERE ((items.id = 70687 OR items.id = 70595) AND itemscontacts.relationship = 's') AND (items.deletedAt IS NULL) 
GROUP BY items.id, tagsitems.itemid, bidresponses.personid, bidresponses.bidtemplatefieldid 
ORDER BY items.id ASC 

沒有SUM()GROUP BY子句該查詢返回了預期的效果,減去重要totalquantity值。

目前困擾我的任務是構造GROUP BY子句,以便它「忽略」NULL或缺少來自bidresponses的值。數據是這樣的,結果將是一組混合的項目 - 有些在投標響應表中有條目,有些則沒有。

編輯: 我希望在bidresponses表中顯示空值的條目。使用當前的GROUP BY子句,它們不是。 我應該注意到,我使用分組的唯一原因是我可以得到總數量值。下面是查詢輸出的一個例子,而不的SUM()和GROUP BY子句:

+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------------------+---------------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+ 
| id | itemtypeid | code | description    | cost | unittypeid | projectid | companyid | createdAt   | updatedAt   | deletedAt | unittype | tagid | itemid | quantity | itemid | contactid | personid | sentdate   | responsedate | bidtemplateid | relationship | awarddate | assigndate | id | companyid | personid | companyidOwner | parentContactid | createdAt   | updatedAt   | firstName | lastName | company    | email    | bidtemplatefieldid | itemid | bidresponse | personid | id | bidtemplatefield | fieldtypeid | contactcreatedAt | contactupdatedAt | bidresponseitemid | bidresponsepersonid | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------------------+---------------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+ 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf     | [email protected]  |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL | 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  22 | 34794 | 2010-08-14 18:44:02 |   NULL |    1 | s   |  NULL |  NULL | 22 |  NULL | 34794 |    1 |   NULL | 2010-08-09 19:56:28 | 2010-08-10 13:55:03 | NULL  | NULL  | anewwwww   | [email protected]   |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-09 19:56:28 | 2010-08-10 13:55:03 |    NULL |    NULL | 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  27 | 34797 | 2010-08-14 22:36:59 |   NULL |    1 | s   |  NULL |  NULL | 27 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:11:52 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:11:52 | NULL    |    NULL |    NULL | 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  28 | 34798 | 2010-08-14 22:37:00 |   NULL |    1 | s   |  NULL |  NULL | 28 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:18:27 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:18:27 | NULL    |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  | 12 | 70687 |  NULL | 70687 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf     | [email protected]  |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  |  2 | 70687 |  NULL | 70687 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf     | [email protected]  |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  | 12 | 70687 |  NULL | 70687 |  27 | 34797 | 2010-08-14 22:36:59 |   NULL |    1 | s   |  NULL |  NULL | 27 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:11:52 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:11:52 | NULL    |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  |  2 | 70687 |  NULL | 70687 |  27 | 34797 | 2010-08-14 22:36:59 |   NULL |    1 | s   |  NULL |  NULL | 27 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:11:52 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:11:52 | NULL    |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  | 12 | 70687 |  NULL | 70687 |  28 | 34798 | 2010-08-14 22:37:00 |   NULL |    1 | s   |  NULL |  NULL | 28 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:18:27 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:18:27 | NULL    |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  |  2 | 70687 |  NULL | 70687 |  28 | 34798 | 2010-08-14 22:37:00 |   NULL |    1 | s   |  NULL |  NULL | 28 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:18:27 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:18:27 | NULL    |    NULL |    NULL | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------------------+---------------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+ 

這裏是查詢輸出一個例子的SUM()和GROUP BY子句:

+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------+----------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+---------------+ 
| id | itemtypeid | code | description    | cost | unittypeid | projectid | companyid | createdAt   | updatedAt   | deletedAt | unittype | tagid | itemid | quantity | itemid | contactid | personid | sentdate   | responsedate | bidtemplateid | relationship | awarddate | assigndate | id | companyid | personid | companyidOwner | parentContactid | createdAt   | updatedAt   | firstName | lastName | company | email   | bidtemplatefieldid | itemid | bidresponse | personid | id | bidtemplatefield | fieldtypeid | contactcreatedAt | contactupdatedAt | bidresponseitemid | bidresponsepersonid | totalquantity | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------+----------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+---------------+ 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf  | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL |   NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  | 12 | 70687 |  NULL | 70687 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf  | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL |   NULL | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------+----------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+---------------+ 
+0

我不確定我是否完全理解你。您希望'bidresponseitemid'和'bidresponsepersonid'列中值爲NULL的結果行不顯示?或者他們沒有出現,你想要他們? 也許包含一個示例結果集(通過在控制檯/終端中使用mysql命令,您可以獲得很好的文本結果)並描述您想要改變的內容。 「WHERE'bidresponsepersonid'不是NULL」可能是你要找的東西。 – Thomas 2010-08-15 07:30:36

+0

謝謝托馬斯。我會在上面澄清。 – 2010-08-15 07:31:35

回答

1

您需要在GROUP BY子句中包含所有重要的非聚合列。現在,你沒有通過createdAt等進行分組。

0

如果你需要所有那些行SUM()和因此所需的GROUP BY將不是一個好的解決方案。

最好的解決方案可能是在處理/循環客戶端代碼/腳本中的所有行時添加數量。

另外,您可以用GROUP BYSUM()查詢兩次,一次以獲得每個items.id然而,即使做了額外的循環,通過在客戶端代碼中的所有行的數量可能比查詢快一倍,也可能取決於大小的結果。

+0

你是對的,我可以做客戶端處理,但我只是覺得必須有一個更簡單的方法...如果只有我可以對GROUP子句應用某種WHERE規則... – 2010-08-15 08:02:43

+0

「GROUP BY」會按照您告訴的方式合併您的行。使用'GROUP BY items.id'你總是會得到該行的id。我不知道有一個功能可以完成你想要的功能。如果你想用SQL來完成,你總是可以發送2個查詢,例如:'SELECT SUM(tagsitems.quantity)AS totalquantity,tagsitems.itemid FROM tagsitems GROUP BY tagitems.itemid'和另一個。順便說一句:不要使用*,除非你真的使用100%。 – Thomas 2010-08-15 08:23:24

+0

事實證明,只是簡單地將group by子句中的3rd字段更改爲itemscontacts.personid而不是bidresponses.personid,這正是我所需要的! – 2010-08-16 00:54:15