Подзапросы не выбирают столбец id
, поэтому нет a.shid
для сравнения. А поскольку подзапросы сгруппированы по месяцам, вы не можете выбрать в них столбец id
.
Вам нужно присоединиться к третьей таблице в подзапросах.
select
(a.count_one / b.count_two) as final_count, a.orders,
a.Months, b.Sum
from
(
select count(*) as count_one, DATE_FORMAT(`date`, "%M %Y") AS `Months`, orders
from first_table
JOIN third_table ON first_table.shid = third_table.id
WHERE third_table.name = 'Any name'
GROUP BY Months)
) a
INNER JOIN
(
select count(*) as count_two, DATE_FORMAT(`date`, "%M %Y") AS `Months`, sum(a) AS Sum
from second_table
JOIN third_table ON second_table.shid = third_table.id
WHERE third_table.name = 'Any name'
GROUP BY Months)
) b
ON a.Months = b.Months
Если Вы не видите, что потребность затем не изменяется!
Иногда необходимо сохранить данные, которые не имеют известной структуры, или ее структура очень энергозависима. В тех случаях, вместо того, чтобы составить таблицу, просто сохраняют XML в Вашу существующую таблицу
У меня есть хороший реальный пример. Один из моих клиентов получает XML-файл от их поставщиков очень часто с некоторыми важными данными. Это глубоко вкладывается. Они должны сравнить его с предыдущим XML-файлом для наблюдения то, что изменилось. Без поддержки XML в базе данных я должен был создать инструмент, который выполняет итерации через узлы XML и ищет соответствия в таблицах реляционной базы данных. Я мог использовать некоторый инструмент сравнения XML-XML, но некоторые проверки касаются некоторых других данных, которые не прибыли из XML-файла, и я должен присоединиться ко всему это вместе. Хорошо, все это не то, что грандиозное предприятие, но все еще - с базами данных XML Вы получаете ту функциональность out-of-the-box.
Вот пример реального мира от системы, я продолжаю работать. Мы имеем базовую систему и создаем код для конкретного заказчика в Java. Другой класс можно назвать, в зависимости от которого клиент проводит. Иногда этот пользовательский код должен сохранить что-то, и мы помещаем его в столбец XML в соответствующей таблице. Это сохраняет нас от моделирования всего под солнцем. Добавление нового клиента обычно просто означает писать и устанавливать код Java.
Оборотная сторона - то, что создание отчетов, запросы и обновления являются более трудными на столбце XML. Нет ни одной из обычных хороших функций базы данных как проверочные ограничения и т.д.
Скажем, у Вас есть объект, который имеет атрибуты. Можно сохранить все те атрибуты в XML вместо того, чтобы создать отдельную таблицу атрибутов. XML был бы более гибким.
Например, Вы получаете XML-документы от некоторой другой системы с очень богатой или сложной структурой, которую Вы хотите сохранить; но Вам только нужны несколько четко определенных запросов для получения тех данных. В этом случае просто проанализируйте данные, необходимо генерировать некоторые индексы и сохранить целую структуру XML в единственном поле.
Чтобы сделать это, Вам не нужно много XML-определенной поддержки на механизме DB, но это все еще помогает сохранить запросы выразительными.
Помимо этого, я предположил бы, что некоторый DMBS с хорошей поддержкой XML мог позволить Вам просто сохранить XML-документ, возможно, не указывая, как индексировать его. Вы просто используете XQuery и надеетесь, что он так или иначе оптимизирует к Вашим потребностям.
Можно обработать данные XML непосредственно в SQL-сервере. Например, можно применить выражения XPath и просто отправить фильтрованный набор результатов клиенту. Функции SQL-сервера могут положиться на возможности обработки XML позже.
Функции выше существуют от SQL Server 2000 MS или 2005.
У меня не было потребности сохранить XML до сих пор, но я часто использую способность возвратить XML из хранимой процедуры. Это делает некоторые вещи очень полезными - главным образом сообщает. Я могу выполнить SP, чтобы генерировать отчет, передать результаты обратно в XML и затем использовать XSLT для отображения результата на сайте очень легко.
Можно сохранить сгенерированный XML пользователя там.
Если веб-сайт как stackoverflow использовал своего рода разметку XML вместо, снижают цену, Вы могли бы сохранить вопрос/ответы как XML в базе данных. Вы могли бы пробовать для парсинга сгенерированного поиска XML этого пользователя собственных тегов.
Гибкость является одной причиной.
Если структура Ваших данных может варьироваться, то можно все еще сохранить общую таблицу RDBMS, наряду с запросами, и т.д. что gor после него с несколько непостоянно структурированными данными.
Если необходимо добавить поле в какой-то момент, можно сделать так, не изменяя структуру таблицы RDMS и таким образом не повредить всех запросы else.
Я использую тип столбца XML для хранения копий всех важных для бизнеса сообщений, которые мы получаем от сторонней службы. Это очень удобно по нескольким причинам.
1) В случае повреждения данных мы можем выполнить обратную трассировку, чтобы увидеть, какие данные поступили, когда и в каком формате.
2) Дальнейшая разработка систем может быть основана на реальных данных из таблицы журнала - просто десериализуйте и используйте данные, как если бы они были получены в результате вызова службы 3p
3) Убедитесь, что специалисты по инфраструктуре заняты выделением дискового пространства серверу БД. ;)
Единственная причина, по которой я когда-либо буду использовать его снова, это когда для расширяемости и гибкости.
Накладные расходы на xml (xpath) и обслуживание (пространства имен) действительно не стоят того хлопот, если можно этого избежать. Ранее мы хранили большие объемы данных в xml и использовали скалярные функции для их извлечения, но это слишком медленно и вызывает огромные головные боли из-за изменений структуры xml или пространства имен.
Но гибкость фантастическая. Вы можете добавлять новые свойства, когда захотите, у вас могут быть данные, специфичные для проекта / клиента / работы, которые не t требуются правильные столбцы. XML не обязательно должен иметь статическую структуру - вам просто нужна фабрика, которая может порождать экземпляры для работы с другим XML (который должен быть связан с проектом / клиентом / заданием).
При добавлении нового таблицу в существующую систему, особенно ту, которая имеет много существующих данных и не может быть легко изменена, я добавлю столбец XML. В будущем, если мне когда-нибудь понадобится добавить еще один столбец в эту таблицу, я могу просто использовать столбец XML, вместо того, чтобы разочаровываться и делать много доработок.
В общем, вы не начинаете с того, что добавляете существенные свойства в XML. Но вам следует добавлять XML, когда вы знаете, что ваша таблица может нуждаться в расширении именно потому, что это дает вам возможность расширения.
XML не обязательно должен иметь статическую структуру - вам просто нужна фабрика, которая может порождать экземпляры для работы с другим XML (который должен быть связан с проектом / клиентом / заданием).При добавлении нового таблицу в существующую систему, особенно ту, которая имеет много существующих данных и не может быть легко изменена, я добавлю столбец XML. В будущем, если мне когда-нибудь понадобится добавить еще один столбец в эту таблицу, я могу просто использовать столбец XML, вместо того, чтобы разочаровываться и делать много переделок.
В общем, вы не начинаете с того, что добавляете существенные свойства в XML. Но вам следует добавлять XML, когда вы знаете, что ваша таблица может нуждаться в расширении, именно потому, что это дает вам возможность расширения.
XML не обязательно должен иметь статическую структуру - вам просто нужна фабрика, которая может порождать экземпляры для работы с другим XML (который должен быть связан с проектом / клиентом / заданием).При добавлении нового таблицу в существующую систему, особенно ту, которая имеет много существующих данных и не может быть легко изменена, я добавлю столбец XML. В будущем, если мне когда-нибудь понадобится добавить еще один столбец в эту таблицу, я могу просто использовать столбец XML, вместо того, чтобы разочаровываться и делать много переделок.
В общем, вы не начинаете с того, что добавляете существенные свойства в XML. Но вам следует добавлять XML, когда вы знаете, что ваша таблица может нуждаться в расширении именно потому, что это дает вам возможность расширения.
При добавлении новой таблицы к существующей системе, особенно той, которая имеет много существующих данных и не может быть легко изменена, я добавлю столбец XML. В будущем, если мне когда-нибудь понадобится добавить еще один столбец в эту таблицу, я могу просто использовать столбец XML, вместо того, чтобы разочаровываться и делать много доработок.
В общем, вы не начинаете с того, что добавляете существенные свойства в XML. Но вам следует добавлять XML, когда вы знаете, что ваша таблица может нуждаться в расширении именно потому, что это дает вам возможность расширения.
При добавлении новой таблицы к существующей системе, особенно той, которая имеет много существующих данных и не может быть легко изменена, я добавлю столбец XML. В будущем, если мне когда-нибудь понадобится добавить еще один столбец в эту таблицу, я могу просто использовать столбец XML, вместо того, чтобы разочаровываться и делать много переделок.
В общем, вы не начинаете с того, что добавляете существенные свойства в XML. Но вам следует добавлять XML, когда вы знаете, что ваша таблица может нуждаться в расширении именно потому, что это дает вам возможность расширения.
Таким образом, вы не начинаете с помещения основных свойств в XML. Но вам следует добавлять XML, когда вы знаете, что ваша таблица может нуждаться в расширении именно потому, что это дает вам возможность расширения.
Таким образом, вы не начинаете с помещения основных свойств в XML. Но вам следует добавлять XML, когда вы знаете, что ваша таблица может нуждаться в расширении именно потому, что это дает вам возможность расширения.