如何编写SQLite代码以显示GROUP_CONCAT函数中的指定代码及其关联代码?

i7uaboj4  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(175)

我正在尝试创建一个包含代码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;
2exbekwf

2exbekwf1#

您应该只使用group by Student_ID,因为您希望每个学生只占一行。
您想要的结果列Status_DateStatus_TIME似乎是每个学生的最小值(我假设日期具有正确的格式YYYY-mm-dd,这是SQLite唯一有效的日期格式)。
另外,应该在HAVING子句中检查条件Code = 'N09'

CREATE TABLE table2 AS
SELECT Student_ID, Status_Complete, 
       MIN(Status_Date) Status_Date, 
       TIME(MIN(Status_Date || ' ' || Status_TIME)) Status_TIME, 
       COUNT(*) count,
       GROUP_CONCAT(Code) Codes
FROM table1
WHERE Status_Complete = 'yes'
GROUP BY Student_ID
HAVING SUM(Code = 'N09') > 0
ORDER BY Student_ID;

请参阅demo
永远不要对列名使用单引号。
在代码中使用时,'Count'是字符串文字。它从未引用过列别名。

11dmarpk

11dmarpk2#

您拥有的WHERE线索排除了所有非N09且状态为已完成的列,因此切换zu a EXISTS子句
正如Lennart指出的那样,这里的HAVING是多余的,因为现在所有行都将至少有1的计数

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 t1
where EXISTS( (SELECT 1 FROM table1 WHERR Code in ('N09') AND Status_Complete = 'yes' AND Student_ID = t1.Student_ID)
group by Student_ID, Status_Date, Status_TIME
ORDER BY Student_ID;

相关问题