Здравствуйте, TimScorp, Вы писали:
TS>Доброго времени суток!!!
TS>Вопрос в следующем:
TS>Имеется БД (Access), в ней имеется таблица с полями (Фамилия, Тип, Месяц)
TS>Пример: TS>Иванов, 1, 9 TS>Петров, 1, 9 TS>Сидоров, 2, 9 TS>Иванов, 2, 9 TS>Иванов, 1, 9 TS>Петров, 3, 9 TS>Петров, 2, 8 TS>Петров, 3, 9
TS>нужно создать отчет за месяц сентябрь (9) и чтобы вывод был вида:
TS>Фамилия Тип 1 Тип 2 Тип 3 TS>Иванов 2 1 0 TS>Петров 1 0 2 TS>Сидоров 0 1 0
TS>Как найти по месяцу при помощи SQL запроса знаю. А как в получившемся результате объединить одинаковые фамилии???
TS>С уважением TimScorp
Наверно я неправильно объяснил, попытаюсь по другому.
В таблице имеются поля: Fam (Фамилия), Дата (дд/мм/гггг), Тип (числовое значение равное 1, 2 или 3; при посещении предмета по математики — 1, по русскому — 2, литературе — 3). За один день один человек может посетить несколько предметов, и один и тот же предмет несколько раз.
Данные из таблицы:
Иванов 01/09/2006 1
Иванов 01/09/2006 1
Петров 01/09/2006 1
Иванов 01/09/2006 2
Сидоров 02/09/2006 3
Сидоров 03/09/2006 1
Петров 04/09/2006 3
Необходимо составить отчет сколько раз за месяц сентябрь каждый человек посетил соответствующие придметы чтобы получилась таблица вида:
Фамилия Математика Русский Литература
Иванов 2 1 0
Петров 1 0 1
Сидоров 1 0 1
С уважением TimScorp.
Re[2]: Создание отчета
От:
Аноним
Дата:
04.09.06 09:13
Оценка:
TS>В таблице имеются поля: Fam (Фамилия)
Ничего, что у двху рахных людей могу тполностью совпадать фамилия-имя-отчество, а уж одна фамилия — как два байта.
TS>Необходимо составить отчет сколько раз за месяц сентябрь каждый человек посетил соответствующие придметы чтобы получилась таблица вида:
TS>Фамилия Математика Русский Литература TS>Иванов 2 1 0 TS>Петров 1 0 1 TS>Сидоров 1 0 1
cross-table лучше делать на клиенте.
В с сервера получать данные
Фамилия Предмет Кол-во
Иванов 2 3
Иванов 3 1
Петров 1 10
и т.д.
Это делается через select sum (кол-во) from table Group by Фамилия, Предмет
А вообще — читайте книги по программированию, например перечисленные на www.iBase.ru
Здравствуйте, Аноним, Вы писали:
TS>>В таблице имеются поля: Fam (Фамилия)
А>Ничего, что у двху рахных людей могу тполностью совпадать фамилия-имя-отчество, а уж одна фамилия — как два байта.
TS>>Необходимо составить отчет сколько раз за месяц сентябрь каждый человек посетил соответствующие придметы чтобы получилась таблица вида:
TS>>Фамилия Математика Русский Литература TS>>Иванов 2 1 0 TS>>Петров 1 0 1 TS>>Сидоров 1 0 1
А>cross-table лучше делать на клиенте.
А>В с сервера получать данные
А>Фамилия Предмет Кол-во А>Иванов 2 3 А>Иванов 3 1 А>Петров 1 10
А>и т.д.
А>Это делается через select sum (кол-во) from table Group by Фамилия, Предмет
А>А вообще — читайте книги по программированию, например перечисленные на www.iBase.ru
Прежде чем давать умные советы внимательно читайте какой задан вопрос, посчитать суммой количество нетрудно, вопрос был совсем в другом, а в запросе я уже разобрался, выглядит он так:
SELECT Fam, (Select count (*) from Dat s1 where s1.Fam = s.Fam and TipD = 0) AS math, (Select count (*) from Dat s2 where s2.fam = s.fam and s2.tipd = 1) AS rus, (select count (*) from Dat s3 where s3.fam = s.fam and s3.tipd = 2) AS lit, (select count (*) from Dat s4 where s4.fam = s.fam and s4.tipd = 3) AS ist
FROM Dat AS s
GROUP BY fam;
Это в Access'е. Ща попробую это в дельфин закинуть.
С уважением TimScorp.
Re[4]: Создание отчета
От:
Аноним
Дата:
05.09.06 08:20
Оценка:
TS>Прежде чем давать умные советы внимательно читайте какой задан вопрос, посчитать суммой количество нетрудно, вопрос был совсем в другом, а в запросе я уже разобрался, выглядит он так:
TS>SELECT Fam, (Select count (*) from Dat s1 where s1.Fam = s.Fam and TipD = 0) AS math, (Select count (*) from Dat s2 where s2.fam = s.fam and s2.tipd = 1) AS rus, (select count (*) from Dat s3 where s3.fam = s.fam and s3.tipd = 2) AS lit, (select count (*) from Dat s4 where s4.fam = s.fam and s4.tipd = 3) AS ist TS>FROM Dat AS s TS>GROUP BY fam;
TS>Это в Access'е. Ща попробую это в дельфин закинуть.
Вопрос не в Дельфи, а в сервере БД.
Взять для примера тот же Firebird + IBExpert и посмотреть статистику такого запроса и линейного. Хотя, если скорость не волнует...
А что делать, если добавится еще один предмет, запрос переделывать придётся, вероятно и новую версию программы делать. Хотя, если будущее не интересует... Впрочем, судя по использованию фамилий для различения людей — совсем не волнует.
За один день один человек может посетить ..... один и тот же предмет несколько раз.
Будет несколько строк ? тогда можно сount.
Или одна строка с указанием кол-ва посещений? тогда таки sum
On Mon, 04 Sep 2006 15:13:38 +0600, Аноним <0@users.rsdn.ru> wrote:
> cross-table лучше делать на клиенте.
Почему? Если read-only то лучше пользоваться встроенными средствами БД,
т.к. она для этого и предназначена.
2TimScorp
Пример для вашего случая см. аттач.
Вообще то, что вам необходимо называется перекрестным запросом (crosstab
query) Access умеет это делать с помощью оператора TRANSFORM (в справке
есть поисание).
Но учтите, что если вы собираетесь в дальнейшем мигрировать на SQL Server
то там что-то подобное появилось только в SQL Server 2005.