Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 128


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 128 (24 февраля 2007 г.)

SQL Exercises

Новым посетителям сайта

Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 57-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ По итогам народного голосования в рамках Премии Рунета наш сайт занял 177 позицию из 436 заявленных проектов. Спасибо всем, кто проголосовал за нас. Может быть подам заявку и в этом году, чтобы проследить динамику развития ресурса. Даешь ТОР 100! :-).

§ Удалось локализовать проблему с некорректной обработкой запросов, использующих XML и тип данных varchar(max). Проблема оказалась в переходе от использования ODBC для подключения к базам к SQL Native Client. Благодаря Александру Гладченко и Алексею Халяко удалось достучаться до разработчиков SQL Native Client из Майкрософт. Привожу их ответ в переводе на русский (с оригиналом ответа и вопросом можно познакомиться здесь):
Что теперь. Похоже, что наше приложение (PhP) еще не умеет правильно работать с Native Client. Раз так, мы постараемся перейти просто на использование ODBC, с которым все работает корректно. А нетерпеливые могут использовать преобразование результата к varchar(8000), что решит проблемы и при использовании Native Client. Надеюсь, что в следующей версии PhP эта проблема будет также решена.

 

§ С прекрасным результатом PavelPS (задач 137, время 3.509) подошел к последней задаче, отделяющей его от третьего этапа.
Надеюсь, что он и Damirishe (137, 8.096) скоро присоединятся к "элите" сайта.
Две задачи отделяют от третьего этапа Ocean (136, 47.406) и cmalex (136, 67.640).

§ Новые лица в сотне:
Arcan (120, 4.715)
Онуфрий Голохвастов (116, 43.964)
Отмечу, что второй своим неблагозвучным ником искорежил нам таблицу ТОР 100 :-).

§ Продвинулись в рейтинге:
User_Name (135, 27.628)
avk (132, 53.998)
Fomichev (124, 12.210)
Edward_rost (124, 62.872)
wasp (124, 65.661)
Kamin (123, 46.278)
15th (118, 9.287)

§ На этой неделе сертифицированы:
Lady (A07003138) [BK] (г.Ростов-на-Дону, Россия)

§ Число подписчиков - 3472

Число участников рейтинга - 8944

Число участников второго этапа - 884

Сертифицировано на сайте - 136

 

Сергей,

Результат replace() возвращается как nvarchar(max). nvarchar(max) имеет неограниченный размер и ODBC представляет его, возвращая 0 в качестве размера столбца. Это может сбить приложения, которые не выполняют специальную проверку на 0, и арифметически определяют размер буфера на основе размера столбца, возвращаемого SQLDescribeCol или подобными вызовами. Я подозреваю, что приложение привязывается к буферу, который всего то и содержит что пустой (NULL) терминатор и, как следствие, получает из ODBC предупреждение об усечении результата. Когда вы преобразуете результат к фиксированному размеру типа varchar, SQLBindCol возвращает размер столбца, соответствующий этому преоразованию, и приложение привязывается к буферу, который имеет достаточно большой размер для размещения результата.

Chris Lee

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Агапов В. (KERBEROS) 141 141 20 333 89 6.183 1.262 11 20 Nov 2006 22 Feb 2007
2 Солдатенков Ю.С. (SolYUtor) 141 141 20 333 265 17.216 2.517 11 07 Feb 2007 23 Feb 2007
3 Кувалкин К.С. (Cyrilus) 141 141 20 333 746 12.417 2.519 11 10 Dec 2006 21 Feb 2007
4 Карасёва Н.В. (vlksm) 141 141 20 333 196 27.850 2.710 11 18 Nov 2006 23 Feb 2007
5 Мурашкин И.В. (lepton) 141 141 20 333 240 14.865 4.724 11 18 Nov 2006 14 Feb 2007
6 Зверев Д.Л. (dimzv) 141 141 20 333 1141 9.324 4.938 11 19 Dec 2006 22 Dec 2006
7 Голубин Р.С. (Roman S. Golubin) 141 141 20 333 457 54.984 33.803 11 18 Nov 2006 22 Feb 2007
8 Войнов П.Е. (pаparome) 140 140 20 329 489 2.738 .049 7 26 Dec 2006 22 Feb 2007
9 Тарасов Д.Б. (Gavrila) 140 140 20 329 466 20.242 .513 7 05 Dec 2006 22 Feb 2007
10 Мальцев А.В. (Палкин) 140 141 20 329 145 27.557 7.373 7 09 Jan 2007 12 Feb 2007
11 Васьков Е.В. (Johan) 140 140 20 329 124 12.713 11.402 7 20 Nov 2006 15 Feb 2007
12 Валуев Д.И. (Fiolent) 139 140 20 326 1188 117.017 62.302 4 05 Dec 2006 23 Feb 2007
13 Юлдашев М.Р. (Snowbear) 139 139 20 325 546 4.113 .000 3 15 Jan 2007 20 Feb 2007
14 Держальцев В.А. (MadVet) 138 139 20 324 540 34.249 3.085 3 08 Oct 2006 19 Oct 2006
15 Палий С.А. (PS_Sergey) 139 139 20 325 212 15.756 4.188 3 01 Dec 2006 03 Dec 2006
16 Бородкина М.И. (marishkin) 138 138 20 322 67 15.105 .000 0 22 Jan 2007 21 Feb 2007
17 Утёнков М.Н. (=Maxim=) 138 138 20 322 200 24.998 .000 0 19 Nov 2006 08 Feb 2007
18 Slobodcicov A.N. (Testo) 136 138 20 319 337 7.171 .000 0 25 Aug 2006 10 Nov 2006
19 Иванов А.Н. (Goapsy) 136 138 20 319 270 18.911 .000 0 07 Aug 2006 22 Feb 2007
20 Шептунов П.П. (PavelPS) 137 137 20 318 55 3.509 .000 0 20 Feb 2007 21 Feb 2007

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Лунёнок А. (runaway) 45 58 94 23 117 511 22 Feb 2007
2 Селиверстов А. (alex_s9v) 29 59 54 32 86 498 20 Feb 2007
3 Шахбулатов Р.Г. (ruslan-shah) 44 44 77 0 77 1706 22 Feb 2007
4 Зализнюк Ю.В. (Zosima1977) 41 41 67 5 72 1883 20 Feb 2007
5 >Цветков Д.-. (=SX=) 40 40 71 0 71 1918 23 Feb 2007
6 >купчинский Р.А. (ruslan_k) 37 37 64 7 71 1920 23 Feb 2007
7 СПИРИНА И.С. (ИРИША) 37 37 68 0 68 2013 21 Feb 2007
8 >Идиятуллин (Massa) 33 33 59 0 59 2401 23 Feb 2007
9 Бабичева И.Н. (Arina) 30 38 56 0 56 2124 21 Feb 2007
10 >N (Ilya_N) 29 35 56 0 56 2257 23 Feb 2007
11 >Кузнецов С.В. (SmithSV) 30 30 55 1 56 2564 23 Feb 2007
12 Щеткин А.Г. (Alex Wolker) 31 31 56 0 56 2569 22 Feb 2007
13 Дикий (Wild Klaus) 29 34 55 0 55 2385 22 Feb 2007
14 Kabanova I. (IKabanova) 30 30 54 0 54 2674 20 Feb 2007
15 Козарь И.С. (ki) 25 49 52 0 52 1423 19 Feb 2007
16 >Креславский О.М. (Arcan) 18 120 47 0 47 78 23 Feb 2007
17 Будылина А.А. (JVC) 23 30 46 0 46 2716 20 Feb 2007
18 Сязанцев (artyom) 27 27 46 0 46 3115 21 Feb 2007
19 Сергей С.С. (=Sergey=) 27 27 45 0 45 3180 22 Feb 2007
20 максимова А.С. (м) 19 36 44 0 44 2129 21 Feb 2007
21 >М (Snus) 24 30 43 0 43 2975 23 Feb 2007
22 Stepin I.A. (Alfred) 18 35 42 0 42 2199 21 Feb 2007
23 >Andreeva M. (Aleksiya*) 25 25 41 1 42 3351 23 Feb 2007
24 Бондаренко А.А. (oo7) 7 70 19 21 40 360 20 Feb 2007
25 Медведева (ЕленаМ) 25 25 40 0 40 3428 21 Feb 2007
26 >Петренко А.А. (SeriousDron) 25 25 40 0 40 3429 23 Feb 2007
27 Boldyrev R. (r_lerman) 25 25 40 0 40 3473 22 Feb 2007

Изучаем SQL

Нарастающие итоги в запросах SQL Server

Arthur Fuller (оригинал: Running totals in SQL Server queries)
Перевод Моисеенко С.И.

Аннотация

Артур Фаллер демонстрирует, как просто получить нарастающие итоги с помощью запросов в SQL Server, если вы понимаете, что требуется получить.

Вам поручают создать запрос в SQL Server, содержащий нарастающие итоги на момент наступления события. Классическим примером является счет в банке.

Для каждого заданного счета вы суммируете дебиты (депозиты) и кредиты (снятие средств) на данный момент времени. После каждой транзакции Вы хотите знать текущий баланс. В листинге А приводится простой пример создания такой таблицы.

Листинг А

CREATE TABLE [dbo].[BankAccount](
    [TransactionID] [int] IDENTITY(1,1) NOT NULL,
     [TransactionDateTime] [datetime] NOT NULL CONSTRAINT [DF_BankAccount_TransactionDateTime] DEFAULT(getdate()),
     [Amount] [money] NOT NULL CONSTRAINT [DF_BankAccount_Amount] DEFAULT((0)),
     [TransactionType] [char](1)COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
     [AccountNumber] [varchar](50)COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT [PK_BankAccount] PRIMARY KEY CLUSTERED
(
     [TransactionID] ASC
)WITH (PAD_INDEX =OFF, IGNORE_DUP_KEY =OFF) ON [PRIMARY]
) ON [PRIMARY]

Вот типичные строки:
1     2006-11-03 02:33:42.340     10000.00
2     2006-11-03 02:34:50.467    -500.00
3     2006-11-03 02:35:04.857     250.00
4     2006-11-03 02:42:19.763    -124.25

Так как дата имеет значение по умолчанию, все, что Вы должны сделать, - это только добавить несколько сумм. Для простоты в примере приводится информация только об одном банковском счете.

Теперь Вы можете создать запрос, который содержит текущий баланс. Так как Вы делаете запись депозитов и изъятий в одном и том же столбце, используя положительные и отрицательные значения, достаточно использовать сумму. Чтобы получить текущий баланс, Вы суммируете все предыдущие транзакции и добавляете полученную сумму к величине текущей транзакции.

Следующий запрос реализует этот алгоритм:

SELECT transactionid, transactiondatetime, amount,
        (SELECT SUM(amount)
        FROM dbo.bankaccount as D1
        WHERE D1.transactiondatetime <= D0.transactiondatetime) AS balance
FROM dbo.bankaccount AS D0

В результате получим следующий набор строк:
1      2006-11-03 02:33:42.340     10000.00      10000.00
2      2006-11-03 02:34:50.467    -500.00      9500.00
3      2006-11-03 02:35:04.857     250.00     9750.00
4      2006-11-03 02:42:19.763    -124.25     9625.75

Как показывает этот пример, нарастающие итоги легко получить, если вы понимаете, что от вас требуется. В данном примере предполагается, что таблица содержит только один счет, но легко обобщить его на случай со многими счетами: Вам нужно лишь добавить в таблицу еще столбец с номером счета - BankAccountNumber, а в запросе в предикате предложения WHERE указать нужный счет.

Вы можете также преобразовать этот пример, чтобы получить нарастающие разности (как в инвентарных счетах). Вы начинаете с описи 1 000, и затем вычитаете различные расходы и поступления.

Такие запросы имеют два важных преимущества:
· Вам не потребуется хранить результаты. При отборе по номеру счета или подобного ему внешнему ключу запрос будет выполняться очень быстро.
· Упрощается работа с журналом транзакций, который может просматриваться построчно. Если возникает ошибка, то Вы будете в состоянии изолировать конкретную транзакцию, которая ее вызвала.

12-02-07

Полезная информация

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

§ В продаже еще имеется книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

В избранное