我正在尝试创建一个包含代码N09的表,其中一个学生被分配了一组包含N09的代码,并且“Status Complete”是YES。我想使用GROUP_CONCAT查看每个集合是否包含N09。我看到了与此类似的问题,但不幸的是,它没有达到我对表2的目标,因为它导致了一个问题。我遇到的这个问题是,计数时一直显示1而不是2、3。它还一直显示N09,而不是显示N09及其GROUP_CONCAT函数集合中的其他代码。在SQLite中,是否有代码可以实现表2的目标?如果我的问题不清楚,请随意评论,因为我是新来的。
表2的目标:
学生号|状态完成|状态日期|状态时间|Code|次|Group_Concat(Code)
-|
1|是|2021-03-03|00:00:00|N09|1|N09
2|是|2021-03-04|10:03:10|N09|2|N09,M33
3|是|2021年03月04日|01:00:10|N09|3|N09、Y03、B55
问题:
学生号|状态完成|状态日期|状态时间|Code|次|Group_Concat(Code)
-|
1|是|2021-03-03|00:00:00|N09|1|N09
2|是|2021-03-04|10:03:10|N09|1|N09
3|是|2021-03-04|01:00:10|N09|1|N09
样本数据:
学生号|状态完成|状态日期|状态时间|编码
-|
1|是|2021-03-03|00:00:00|N09
2|是|2021-03-04|10:03:10|N09
2|是|2021-03-04|10:03:10|M33
3|是|2021-03-04|01:00:10|N09
3|是|2021-03-04|01:00:10|Y03
3|是|2021-03-04|01:00:10|B55
代码:
CREATE TABLE table2 AS
select Student_ID
,Status_Complete
,Status_Date
,Status_TIME
,Code
,count(Code) /*over (partition by Student_ID,Code)*/ as 'Count'
,GROUP_CONCAT(Code)
from table1
where Code in ('N09') AND Status_Complete = 'yes'
group by Student_ID, Status_Date, Status_TIME, 'Count'
HAVING 'Count'> 0
ORDER BY Student_ID;
2条答案
按热度按时间2exbekwf1#
您应该只使用
group by Student_ID
,因为您希望每个学生只占一行。您想要的结果列
Status_Date
和Status_TIME
似乎是每个学生的最小值(我假设日期具有正确的格式YYYY-mm-dd
,这是SQLite唯一有效的日期格式)。另外,应该在
HAVING
子句中检查条件Code = 'N09'
:请参阅demo。
永远不要对列名使用单引号。
在代码中使用时,
'Count'
是字符串文字。它从未引用过列别名。11dmarpk2#
您拥有的WHERE线索排除了所有非N09且状态为已完成的列,因此切换zu a
EXISTS
子句正如Lennart指出的那样,这里的HAVING是多余的,因为现在所有行都将至少有1的计数