используйте CASE с SQLITE для сопоставления полей - PullRequest
2 голосов
/ 18 июля 2010

У меня есть база данных SQLite с именами студентов.У каждого ученика разные классы.У меня есть таблица с оценками и классами учеников и другая таблица, которая определяет класс по типу.Я хотел бы выполнить запрос (который я буду сохранять в виде CSV для использования в OpenOffice в качестве документа Excel для слияния).Мне нужно перечислить оценки по математике, по истории, по естествознанию и по английскому языку.Тем не менее, некоторые учащиеся имеют более 1 класса по математике, естественным наукам, английскому языку или истории.(Как) я мог бы создать оператор CASE (и, возможно, представление), что, если действительно существует более одного класса Math, его можно перечислить в представлении как Math_Class_2 для примера?

Ответы [ 2 ]

1 голос
/ 23 июля 2010

Идея состоит в том, чтобы заставить SQL выполнять работу, а не делать это за нее.

Предполагая три таблицы:

Student (StudentNo, StudentName)

Class (ClassNo, ClassName)

Результат (ClassNo, StudentNo, Grade)

Запрос будет:

SELECT StudentName, group_concat(ClassName || "," || Grade)
FROM Student
INNER JOIN Result ON Result.StudentNo=Student.StudentNo
INNER JOIN Class ON Result.ClassNo=Class.ClassNo
GROUP BY Student.Studentno;

(group_concat - еще одно позднее добавление к SQlite. Присутствует в 3.7).

Вот дамп всех команд, которые я использовал:

CREATE TABLE [Student] (
[StudentNo] INTEGER  NOT NULL PRIMARY KEY,
[StudentName] TEXT  NULL
);
INSERT INTO "Student" VALUES(1,'Jimmy');
INSERT INTO "Student" VALUES(2,'Bob');
INSERT INTO "Student" VALUES(3,'Anna');
CREATE TABLE [Class] (
[ClassNo] INTEGER  NOT NULL PRIMARY KEY,
[ClassName] TEXT  NULL
);
INSERT INTO "Class" VALUES(1,'English');
INSERT INTO "Class" VALUES(2,'Algebra');
INSERT INTO "Class" VALUES(3,'Geometry');
INSERT INTO "Class" VALUES(4,'Pre-Cal');
CREATE TABLE [Result] (
[StudentNo] INTEGER  NOT NULL,
[ClassNo] INTEGER  NOT NULL,
[Grade] INTEGER  NOT NULL,
PRIMARY KEY ([StudentNo],[ClassNo])
);
INSERT INTO "Result" VALUES(1,1,70);
INSERT INTO "Result" VALUES(1,2,75);
INSERT INTO "Result" VALUES(1,3,80);
INSERT INTO "Result" VALUES(2,1,85);
INSERT INTO "Result" VALUES(2,2,90);
INSERT INTO "Result" VALUES(3,4,95);

Выполнение запроса возвращает это (вы можете настроить разделительный символ):

Jimmy,English,70,Algebra,75,Geometry,80

Bob,English,85,Algebra,90

Anna,Pre-Cal,95

0 голосов
/ 23 июля 2010

Мои два цента ...

В настоящее время я работаю над приложением для Android, которое использует базу данных sqlite.Мне нужно было использовать оператор CASE, и он работал !!! .

В таблице есть столбец со значением частоты времени в миллисекундах, но для конечного пользователяМне нужно было показать информацию в более простом для понимания виде, поэтому я использовал SQL-оператор (кстати, этот оператор составлен программно ... он не задан жестко): -p

SELECT 
case when alarm_time_frequency='0' then 'Not Used' 
when alarm_time_frequency='300000' then '5 min' 
when alarm_time_frequency='600000' then '10 min' 
when alarm_time_frequency='900000' then '15 min' 
when alarm_time_frequency='1800000' then '30 min' 
when alarm_time_frequency='3600000' then '1 hour' 
when alarm_time_frequency='7200000' then '2 hours' 
when alarm_time_frequency='10800000' then '3 hours' 
when alarm_time_frequency='14400000' then '4 hours' 
when alarm_time_frequency='21600000' then '6 hours' 
when alarm_time_frequency='28800000' then '8 hours' 
when alarm_time_frequency='43200000' then '12 hours' 
when alarm_time_frequency='86400000' then '24 hours' 
end 
as alarm_time_frequency FROM ALARMS 

I hope this helps...
...