Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





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


15-1209283131
Knight
2008-04-27 11:58
2008.06.08
Флешка взбунтовалась&#133


2-1210671008
Виктор
2008-05-13 13:30
2008.06.08
Помогите найти ошибку в коде


2-1210741269
noviceman
2008-05-14 09:01
2008.06.08
Уничтожение объекта из "своего" события.


15-1209124924
sql
2008-04-25 16:02
2008.06.08
MS SQL 2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский