我对 SQL 和 Java 很陌生,对我正在做的示例练习有疑问。我正在尝试转换此表:
SELECT id, lname, fname, credit, year, course
FROM records
WHERE id is NOT NULL
ORDER BY last_name, first_name;
身份证 | l姓名 | f名称 | 信用 | 年 | 课程 |
---|---|---|---|---|---|
01001 | 亚当斯 | 约翰 | 博士 | N | 1110 |
01001 | 亚当斯 | 约翰 | 博士 | N | 2001 |
01001 | 亚当斯 | 约翰 | 博士 | N | 2115 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 1002 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 1016 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 1019 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 1008 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 2110 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 2010 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 2030 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 2200 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 2201 |
02003 | 亚历山大 | 艾米 | 医学博士 | N | 2310 |
01400 | 安德森 | 路易丝 | 博士 | N | 2311 |
01400 | 安德森 | 路易丝 | 博士 | N | 2361 |
01400 | 安德森 | 路易丝 | 博士 | N | 2062 |
01400 | 安德森 | 路易丝 | 博士 | N | 2008 |
01400 | 安德森 | 路易丝 | 博士 | N | 2002 |
将第 N 年列转换为:
01 年:有 1110
02年:有2110
03 年:没有 (1110; 2110; 3110)
这样程序就会打印出这样的东西:
身份证 | l姓名 | f名称 | 信用 | 年 |
---|---|---|---|---|
0100 | 亚当斯 | 约翰 | 博士 | 01 |
02003 | 亚历山大 | 艾米 | 医学博士 | 02 |
01400 | 安德森 | 路易丝 | 博士 | 03 |
我有一个编码如下的结果集:
String SQL = " SELECT id, lname, fname, credit, year, course "
+ " FROM records "
+ " WHERE id is NOT NULL "
+ " ORDER BY last_name, first_name; "
PreparedStatement printSQL = connection.prepareStatement(SQL);
ResultSet rs = printSQL.executeQuery();
while(rs.next()) {
if(year.equals("N") && course.equals("1110")) {
year = "01";
}
else if(year.equals("N") && course.equals("2110")) {
year = "02";
}
else if(year.equals("N") && (!course.equals("1110")
&& !course.equals("2110")&& !course.equals("3110"))){
year = "03";
}
}
但它只检查第一个人或最后一个人,而不检查所有具有 1110、2110 或不具有 1110、2110 和 3110 的行。感谢任何帮助!
您是否希望将多行折叠为单行来表示学生所在的年级?我建议在 sql 中执行此操作,而不要使用 java:
select id, lname, fname, credit
, coalesce(
MAX(case when course = '1110' then '01' end)
, MAX(case when course = '2110' then '02' end)
, '03'
) as year
from
(
VALUES (N'01001', N'Adams', N'John', N'PHD', N'N', 1110)
, (N'01001', N'Adams', N'John', N'PHD', N'N', 2001)
, (N'01001', N'Adams', N'John', N'PHD', N'N', 2115)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 1002)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 1016)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 1019)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 1008)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2110)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2010)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2030)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2200)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2201)
, (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2310)
, (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2311)
, (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2361)
, (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2062)
, (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2008)
, (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2002)
) t (ID,lName,fName,credit,year,course)
group by id, lname, fname, credit
这称为条件聚合。您可以在 CASE WHEN 内调节您想要看到的内容并将其包裹在 MAX 周围。这将返回您正在查找的值或 NULL。
通过使用 COALESCE,您可以获取第一个 NULL,然后它会告诉您学生是否有 1110、2110 或没有。