我有两张表格如下
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
有人可以请一点帮助!!
答案 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
。