2014-04-01 86 views
1

我有以下表:SQL:分割一列分成多个

CREATE TABLE yow(
    userid INT, 
    itemid INT, 
    feedback INT, 
    value INT) 

(用户ID,为itemid,反馈)可被认为是主键,其中每个这些元组的包含一个值。

我想要一个查询,它返回一个包含以下列的表: userid | itemid | col0 | col1 | COL2

凡COL0包含valueyow所有行,其中反馈= 0,和COL1包含value其中反馈= 1等。

我有一个有点工作查询:

SELECT 
yow.userid AS uid, 
yow.itemid AS iid, 
isNull(col0.value, 0) AS col0, 
IsNull(col1.value, 0) AS col1, 
IsNull(col2.value, 0) AS col2 
FROM yow 

LEFT JOIN yow AS col0 ON col0.userid=yow.userid AND col0.itemid=yow.itemid 
LEFT JOIN yow AS col1 ON col1.userid=yow.userid AND col1.itemid=yow.itemid 
LEFT JOIN yow AS col2 ON col2.userid=yow.userid AND col2.itemid=yow.itemid 

WHERE col0.feedback = 0 
AND col1.feedback = 1 
AND col2.feedback = 2 
GROUP BY uid, iid 

的问题是,我可以有一个值(用户ID,商品ID)在COL1 COL2或而不是其他。与此查询,这些行会被过滤掉,而不是失踪细胞缺省为0。

。作为一个例子,我得到这样的:

+-------+-------+--------+--------+--------+ 
| UID | IID | COL0 | COL1 | COL2 | 
+-------+-------+--------+--------+--------+ 
|  1 | 101 |  23 |  22 | 241 | 
|  1 | 101 |  51 |  13 | 159 | 
|  2 | 102 |  22 |  55 | 152 | 
|  3 | 103 |  14 |  41 | 231 | 
+-------+-------+--------+--------+--------+ 

而是我想是这样的,在col0的缺失值默认为0.

+-------+-------+--------+--------+--------+ 
| UID | IID | COL0 | COL1 | COL2 | 
+-------+-------+--------+--------+--------+ 
|  1 | 101 |  23 |  22 | 241 | 
|  1 | 101 |  51 |  13 | 159 | 
|  1 | 102 |  0 |  15 | 142 | 
|  2 | 102 |  22 |  55 | 152 | 
|  2 | 103 |  0 |  45 |  92 | 
|  3 | 103 |  14 |  41 | 231 | 
+-------+-------+--------+--------+--------+ 

任何人都可以建议修复我的查询或建议更好的?我在H2上运行这个,所以我认为查询应该有点标准。谢谢:)

+0

添加反馈列的选择,看看他们正在过滤。 –

+0

@PreetSangha,谢谢。这是你的意思吗? https://gist.github.com/monsendag/f32957897950aa5bfb22 查询添加三个反馈列,其中第一个包含零,第二个包含零等。我应该寻找什么? – Dag

回答

1

where条件会过滤掉所有null(缺失)条目。为了避免这种情况,您需要将feedback = x移至连接条件。而不是尝试以下操作:

SELECT 
yow.userid AS uid, 
yow.itemid AS iid, 
isNull(col0.value, 0) AS col0, 
IsNull(col1.value, 0) AS col1, 
IsNull(col2.value, 0) AS col2 
FROM yow 
LEFT JOIN yow AS col0 ON col0.feedback = 0 
AND col0.userid=yow.userid AND col0.itemid=yow.itemid 
LEFT JOIN yow AS col1 ON col1.feedback = 1 
AND col1.userid=yow.userid AND col1.itemid=yow.itemid 
LEFT JOIN yow AS col2 ON col2.feedback = 2 
AND col2.userid=yow.userid AND col2.itemid=yow.itemid 
GROUP BY uid, iid 

+0

'ON ..'后面有一个错字,但假设是正确的,所以它现在按预期工作。谢谢:) – Dag