Главная страница
    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.058 c
3-1198719461
fluxion
2007-12-27 04:37
2008.06.08
SQL. Помогите с запросом.


2-1209999304
TStas
2008-05-05 18:55
2008.06.08
Что такое class of ?


2-1210777209
Jeqa
2008-05-14 19:00
2008.06.08
автоподстановка (автопоиск)


2-1210829900
Кирей
2008-05-15 09:38
2008.06.08
Работа с excel, форматирование


3-1199286026
Ivanovv
2008-01-02 18:00
2008.06.08
Сбой при попытке поключится с помощью ADO





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский