我有一个包含多个记录的数据库,我想要分组。例如:
cat_id | p_id | amount | sold | date | title
---------------------------------------------
1 | 1 | 4 | 3 | 2015-04-21 | title of product 1
1 | 1 | 0 | 5 | 2015-04-03 |
2 | 1 | 3 | 1 | 2015-04-21 | title of product 2
2 | 1 | 0 | 3 | 2015-04-05 |
在此表中,有两个独特的产品,cat_id 1
中的p_id 1
和cat_id 1
中的p_id 2
。现在,我希望获得所有产品的所有列表,并将其amount
和sold
相加。仅在数量> 1的情况下填写标题。 0。
所以我写了这个查询:
SELECT SUM (amount), SUM(sold) cat_id, p_id, title
FROM table
GROUP BY cat_id, p_id
这让我回报:
cat_id | p_id | amount | sold | title
---------------------------------------------
1 | 1 | 4 | 8 |
2 | 1 | 3 | 4 |
所以现在我错过了我的头衔。
我尝试了一些链接GROUP_CONCAT(DISTINCT title)
,但这种连接,并不是我真正想要的东西。我只需要标题。
我该如何解决这个问题。
注意:更新了问题
答案 0 :(得分:1)
在标题周围添加MAX()将强制它选择NOT NULL值
SELECT SUM (amount), SUM(sold) cat_id, p_id, MAX(title)
FROM table
WHERE amount > 0
GROUP BY cat_id, p_id
答案 1 :(得分:1)
此处标题的基本问题是,如果您使用没有聚合函数的GROUP BY
,则返回的值是不确定的(请参阅this question)。
所以你最好的选择是以某种方式解决这个问题 - 一个明显的解决方案是为每一行填写title
,而不仅仅是数量在哪里> 0(甚至更好,规范化您的数据!)。但是,如果您不能这样做,您可以在GROUP_CONCAT
中使用标题中不存在的分隔符(例如,“||||”),并且GROUP_CONCAT
返回文本字段,您可以使用REPLACE
来摆脱它:
SELECT SUM (amount), SUM(sold) cat_id, p_id, REPLACE(GROUP_CONCAT(DISTINCT title ORDER BY title DESC SEPARATOR '||||'), '||||', '') AS title
FROM table
GROUP BY cat_id, p_id
我制作了一个简化的SQL小提琴here,也许你可以随意使用它来做你想要的。
答案 2 :(得分:1)
您需要在标题上使用MAX(),以便拉出非空白或空的标题。看起来有点奇怪,虽然你的桌子是这样设计的......
SELECT SUM(amount), SUM(sold) cat_id, p_id, MAX(title) AS `Title`
FROM table
GROUP BY cat_id, p_id
答案 3 :(得分:0)
尝试:
SELECT SUM (amount), SUM(sold), cat_id, p_id, title
FROM table
GROUP BY cat_id
更新SQLFiddle:http://sqlfiddle.com/#!9/a5ca3/3