Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.08;
Скачать: CL | DM;

Вниз

получить несколько столбцов для одного поля   Найти похожие ветки 

 
porter   (2008-01-07 02:22) [0]

Для упрощение вопроса возьму 2 абстрактные таблицы
Главная: Испытуемый; Подчиненная: Параметр.

Испытуемый
PK   ID
     Name
     Param_ID
     Value

Параметр
PK   ID
     parName

Из них надо получить таблицу вида:
--------------------------------------------------------
Name |  parName1 | parName2 | parName3 | ...
--------------------------------------------------------
Имя   |     Value     | Value

где parName1, parName2 -это значения parName, удовлетворяющие определённым условиям.


 
turbouser ©   (2008-01-07 02:31) [1]

Это возможно сделать только если на клиенте генерировать текст запроса.


 
DrPass ©   (2008-01-07 02:35) [2]

Средствами SQL на IB6.x никак. На FB1.5 и выше можно сделать ХП, которая динамически сделает запрос, выполнит его через EXECUTE STATEMENT и вернет искомый датасет. Это анальный способ.
Неанальный, действующий и на IB6, и на всех FB - взять генератор отчетов (например, FastReport), и сделать там кросс-отчет по этим табличкам.
P.S. Использование IB6.x - это тоже анальный способ создания программ. Есть масса причин заменить ее на FB, и нет ни одной, чтобы ее использовать...


 
PEAKTOP ©   (2008-01-07 04:15) [3]

http://delphiplus.org/articles/ib/firebird-2-full-capability/1/index.html


 
porter   (2008-01-07 18:37) [4]


> PEAKTOP ©   (07.01.08 04:15) [3]
>
> http://delphiplus.org/articles/ib/firebird-2-full-capability/1/index.
> html

Спасибо, кажется, статья указала правильное направление.
Остался один вопрос:
Использую конструкцию для Firebird 1.5  
SELECT TMC.NAME,
   (SELECT FIRST 1 TQ.QUANT FROM TABL$P_TMC_QUANT TQ WHERE(TQ.TMC_ID = TMC.ID)AND(TQ.PLACE_ID = "1")) AS QUANT_1
и т.д.

При этом получается таблица вида:
--------------------------------------------------------
Name |  parName1 | parName2 | parName3 | ...
--------------------------------------------------------
Имя1   |     Value1     | Value 2   | Value 3
Имя2   |     Value1     | Value 2   | Value 3
Имя3   |     Value1     | Value 2   | Value 3

Т.е. значения Value для каждой колонки parName берутся по первому полученному. Причиной, видимо, FIRST 1.
Подскажите, что я не так делаю


 
PEAKTOP ©   (2008-01-07 18:57) [5]

> Подскажите, что я не так делаю

У тебя ошибка в 17-й строке.


 
Johnmen ©   (2008-01-07 19:00) [6]

Кстати о терминологии - перепутаны главная и подчиненная.


 
porter   (2008-01-07 19:08) [7]

Приведу для ясности реальные таблицы:
1. Ведомость:
CREATE TABLE "MarkSheets" (
   ID                  TINTEGER_NOTNULL NOT NULL,
   "MarkSheetType_ID"  TINTEGER_NOTNULL,
   "Manager_ID"        TINTEGER_NOTNULL,
   "Class_ID"          TINTEGER_NOTNULL,
   "Student_ID"        TINTEGER_NOTNULL,
   "Discipline_ID"     TINTEGER_NOTNULL,
   "Mark"              TINTEGER_NOTNULL,
   "DocumentDate"      TTIMESTAMP,
   "Number"            TINTEGER_CANNULL
);


2. Студенты:
CREATE TABLE "Student" (
   ID            TINTEGER_NOTNULL NOT NULL,
   "Class_ID"    TINTEGER_NOTNULL,
   "Surname"     TVARCHAR_NOTNULL,
   "Name"        TVARCHAR_NOTNULL,
   "Patronymic"  TVARCHAR_NOTNULL,
   "Birthday"    TDATE,
   "Address"     TVARCHAR_NOTNULL,
);

Пытаюсь запросом сформировать ведомость оценок (Mark) для одного класса по одному предмету за 4 четверти. Таким запросом:
select "Student"."Surname",
(select FIRST 1 "MarkSheets"."Mark" from "MarkSheets", "MarkSheetType" where "MarkSheetType".ID = 1 AND "MarkSheetType".ID = "MarkSheets"."MarkSheetType_ID" AND "MarkSheets"."Class_ID" = 3 and "MarkSheets"."Discipline_ID" = 2) AS PAR1,
(select FIRST 1 "MarkSheets"."Mark" from "MarkSheets", "MarkSheetType" where "MarkSheetType".ID = 2 AND "MarkSheetType".ID = "MarkSheets"."MarkSheetType_ID" AND "MarkSheets"."Class_ID" = 3 and "MarkSheets"."Discipline_ID" = 2) AS PAR2,
(select FIRST 1 "MarkSheets"."Mark" from "MarkSheets", "MarkSheetType" where "MarkSheetType".ID = 3 AND "MarkSheetType".ID = "MarkSheets"."MarkSheetType_ID" AND "MarkSheets"."Class_ID" = 3 and "MarkSheets"."Discipline_ID" = 2) AS PAR3,
(select FIRST 1 "MarkSheets"."Mark" from "MarkSheets", "MarkSheetType" where "MarkSheetType".ID = 4 AND "MarkSheetType".ID = "MarkSheets"."MarkSheetType_ID" AND "MarkSheets"."Class_ID" = 3 and "MarkSheets"."Discipline_ID" = 2) AS PAR4
from "Student" where ("Student"."Class_ID" = 3)


Получаю набор данных, вида:
Фаимилия | Четверть1 | Четверть 2 | ...
Иванов     |       5       |       3
Петров     |       5       |       3
Сидаров   |       5       |       3

Фактически должен получится набор вида:
Фаимилия | Четверть1 | Четверть 2 | ...
Иванов     |       5       |       3
Петров     |       4       |       5
Сидаров   |       2       |       4


 
PEAKTOP ©   (2008-01-07 19:46) [8]

На хрена это ?

....
(select FIRST 1 "MarkSheets"."Mark"
from    "MarkSheets", "MarkSheetType"
where "MarkSheetType".ID = 1 -- он всегда будет равен "1"
 AND "MarkSheetType".ID = "MarkSheets"."MarkSheetType_ID" -- это уже бессмысленно
 AND  "MarkSheets"."Class_ID" = 3
 and  "MarkSheets"."Discipline_ID" = 2) AS PAR1,
....


А так ?

SELECT ST.SURNAME
 ,(SELECT FIRST 1 M.MARK
   FROM   MARKSHEETS M
   WHERE  (M.MARKSHEETTYPE_ID = 1)
     AND  (M.STUDENT_ID       = ST.ID)
     AND  (M.DISCIPLINE_ID    = 2)
   )AS PAR1

 ,(SELECT FIRST 1 M.MARK
   FROM   MARKSHEETS M
   WHERE  (M.MARKSHEETTYPE_ID = 2)
     AND  (M.STUDENT_ID       = ST.ID)
     AND  (M.DISCIPLINE_ID    = 2)
   )AS PAR1

 ,(SELECT FIRST 1 M.MARK
   FROM   MARKSHEETS M
   WHERE  (M.MARKSHEETTYPE_ID = 3)
     AND  (M.STUDENT_ID       = ST.ID)
     AND  (M.DISCIPLINE_ID    = 2)
   )AS PAR1
FROM   STUDENT ST
WHERE (ST.CLASS_ID = 3)


И еще. Перестань пользовать имя таблицы в качестве предиката к имени поля. Для этого есть псевдонимы (FROM "TableName" T1). В FireBird-е версий 1.5.4 и 2.0 это считается минимум не кошерным, а в версии 2.1 ты можешь в некоторых случаях пойти лесом с таким запросом. В версии 2.5 разработчики обещали вообще снести такой синтаксис навсегда.


 
porter   (2008-01-07 20:10) [9]

Спасибо, циферки стали разные :-)
where  "MarkSheetType".ID = 1  -- он всегда будет равен "1" - эт в целях проверки. Параметры ещё негде в запрос вводить.
А имя таблицы в качестве предиката - потому что у IBExpert"а автокомплит удобный


 
PEAKTOP ©   (2008-01-07 21:10) [10]

> А имя таблицы в качестве предиката - потому что у IBExpert"а
> автокомплит удобный


Автокомплит нормально понимает предикаты. Эту функциональность Саша Хвастунов еще два года назад реализовал.


 
porter   (2008-01-07 21:40) [11]

Я уже осознал :-)



Страницы: 1 вся ветка

Текущий архив: 2008.06.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
2-1210765392
Washington
2008-05-14 15:43
2008.06.08
Переименование файла


2-1211134192
rena
2008-05-18 22:09
2008.06.08
Преобразование типа Char


15-1209021341
inew
2008-04-24 11:15
2008.06.08
Язык ввода по умолчанию


8-1182057937
Alexys
2007-06-17 09:25
2008.06.08
Закрашивание объектов.


4-1190891664
apic
2007-09-27 15:14
2008.06.08
usb