Создание отчета
От: TimScorp  
Дата: 03.09.06 06:24
Оценка:
Доброго времени суток!!!

Вопрос в следующем:

Имеется БД (Access), в ней имеется таблица с полями (Фамилия, Тип, Месяц)

Пример:
Иванов, 1, 9
Петров, 1, 9
Сидоров, 2, 9
Иванов, 2, 9
Иванов, 1, 9
Петров, 3, 9
Петров, 2, 8
Петров, 3, 9

нужно создать отчет за месяц сентябрь (9) и чтобы вывод был вида:

Фамилия Тип 1 Тип 2 Тип 3
Иванов 2 1 0
Петров 1 0 2
Сидоров 0 1 0

Как найти по месяцу при помощи SQL запроса знаю. А как в получившемся результате объединить одинаковые фамилии???

С уважением TimScorp
Re: Создание отчета
От: MikePetrichenko Беларусь www.btframework.com
Дата: 03.09.06 06:30
Оценка:
Здравствуйте, 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


GROUP BY <имя поля>
Bluetooth, IrDA, WiFi and Serial Ports SDK for .NET, ActiveX, C++ and VCL
Spektrum Telemetry Log File Viewer
Re: Создание отчета
От: TimScorp  
Дата: 04.09.06 03:21
Оценка:
Наверно я неправильно объяснил, попытаюсь по другому.

В таблице имеются поля: 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
Re[3]: Создание отчета
От: TimScorp  
Дата: 04.09.06 17:21
Оценка:
Здравствуйте, Аноним, Вы писали:

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
Re[3]: Создание отчета
От: ItanKo Россия http://itanko.org.ru/
Дата: 10.09.06 09:01
Оценка:
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.

--
.·'''`·...·`


Приложенные файлы:
trans.rar (8,80 KB)
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.