加入一个小组和枢轴

时间:2014-01-10 12:33:13

标签: mysql sql select group-by max

我有两张表格如下

TBL1

id     qNum
1      1
2      2
3      3

TBL2

id    qNum    displayNum
1     1       3
2     2       1
3     2       2
4     2       4

理想情况下,我需要一个sql结果看起来像这样

qNum    display1    display2    display3    display4
1       0           0           1           0
2       1           1           0           1
3       0           0           0           0

我尝试过以下sql,但这不正确

SELECT
tbl1.qNum,
CASE when tbl2.displayNum=1 then 1 else 0 end AS filter1,
CASE when tbl2.displayNum=2 then 1 else 0 end AS filter2,
CASE when tbl2.displayNum=3 then 1 else 0 end AS filter3,
CASE when tbl2.displayNum=4 then 1 else 0 end AS filter4,
CASE when tbl2.displayNum=5 then 1 else 0 end AS filter5
FROM
tbl1
Left Join tbl2 ON tbl1.qNum = tbl2.qNum
GROUP BY
tbl1.qNum

有人可以请一点帮助!!

3 个答案:

答案 0 :(得分:1)

您已使用MAX功能来旋转表格

试试这个:

SELECT tbl1.qNum,
       MAX(CASE WHEN tbl2.displayNum=1 THEN 1 ELSE 0 END) AS filter1,
       MAX(CASE WHEN tbl2.displayNum=2 THEN 1 ELSE 0 END) AS filter2,
       MAX(CASE WHEN tbl2.displayNum=3 THEN 1 ELSE 0 END) AS filter3,
       MAX(CASE WHEN tbl2.displayNum=4 THEN 1 ELSE 0 END) AS filter4,
       MAX(CASE WHEN tbl2.displayNum=5 THEN 1 ELSE 0 END) AS filter5
FROM tbl1
LEFT JOIN tbl2 ON tbl1.qNum = tbl2.qNum
GROUP BY tbl1.qNum

答案 1 :(得分:0)

您的查询几乎是正确的,您只是缺少一个聚合函数:

SELECT
tbl1.qNum,
MAX(CASE when tbl2.displayNum=1 then 1 else 0 end) AS filter1,
MAX(CASE when tbl2.displayNum=2 then 1 else 0 end) AS filter2,
MAX(CASE when tbl2.displayNum=3 then 1 else 0 end) AS filter3,
MAX(CASE when tbl2.displayNum=4 then 1 else 0 end) AS filter4,
MAX(CASE when tbl2.displayNum=5 then 1 else 0 end) AS filter5
FROM
tbl1
Left Join tbl2 ON tbl1.qNum = tbl2.qNum
GROUP BY
tbl1.qNum

您选择的列应始终位于group by子句中,或者应将聚合函数应用于它们。一个组“折叠”一组行,如果列上没有聚合函数(不在组中),则显示该组的随机行。

在这里,您可以阅读有关不同聚合函数的信息:GROUP BY (Aggregate) Functions

我们这里的MAX()函数返回最大值(注意:不是具有最大值的行。您也可以这样查询:select min(col), max(col) from whatever)。

答案 2 :(得分:0)

我只想指出在MySQL中,你可以简化表达式。它不需要case语句,因为布尔值被视为值为0和1的整数:

SELECT tbl1.qNum,
       MAX(tbl2.displayNum = 1) AS filter1,
       MAX(tbl2.displayNum = 2) AS filter2,
       MAX(tbl2.displayNum = 3) AS filter3,
       MAX(tbl2.displayNum = 4) AS filter4,
       MAX(tbl2.displayNum = 5) AS filter5
FROM tbl1 Left Join
     tbl2
     ON tbl1.qNum = tbl2.qNum
GROUP BY tbl1.qNum;

通常,我更喜欢使用ANSI标准语法。但是,我发现这比case语法更容易阅读。

此外,如果您感兴趣的所有值都已在tbl1中,则查询可能不需要tbl2