Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как в Access 2013 создать временное поле с условием

Как в Access 2013 создать временное поле с условием, что системное время фиксируется после выполнения определенного условия
Ответ:
Mina Anna Mazzini
LenaVlas
Как в Access 2013 создать временное поле с условием [1], что системное время фиксируется после выполнения определенного условия [2]


Пожалуйста, то же самое, только другими словами.

И, поле - где? В таблице, в запросе, на форме?
Ах, да! в Access 2013!
Рация на танке...
.
чо ржать та
человек в начале Пути


просто правильно об"яви Переменную напр-р ВрмОкнч

.. тыгдык....выполняется определенное условие.... тыгдык.....

ВрмОкнч=Time

потом юзай ея
Вопрос: Помогите пожалуйста с запросом SQL Server (курсоры, циклы)

Есть три таблицы: Магазины (Shops), продажи (Sales), Товар (Product).
Shops(id, name)
Sales(day, numShop, numProduct, Sales)
Product(id, name)

нужно создать временную таблицу create table #temp(date datatime, nameshop varchar, productName varchar, sumSeles numeric, selesAverage numeric)

Нужно по каждому дню записать в временную таблицу по каждому филиалу товар, который продается больше чем средняя продажа товара в этот день по этому магазину.
Ответ:
sergeyivanov
Есть три таблицы: Магазины (Shops), продажи (Sales), Товар (Product).
Shops(id, name)
Sales(day, numShop, numProduct, Sales)
Product(id, name)

нужно создать временную таблицу create table #temp(date datatime, nameshop varchar, productName varchar, sumSeles numeric, selesAverage numeric)

Нужно по каждому дню записать в временную таблицу по каждому филиалу товар, который продается больше чем средняя продажа товара в этот день по этому магазину.
Это чё? Очередной курсовой без изучения матчасти?
Группировочка, и select from (select from...) вам в помощь. Ну, пока оптимизировать не заставили...
Вопрос: Разбить сложный запрос на несколько простых

Подскажите, пожалуйста, как правильно разбивать сложные запросы на мелкие логические части, чтобы была возможность использовать ORDER BY?
Допустим, какие средства MS SQL Server 2014 предоставляет, чтобы 3 вложенных или зависимых запроса разложить по 3 зависимым переменным?
В данный момент использую временные таблицы с помощью конструкции вида:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
IF OBJECT_ID('tempdb.dbo.#ЗапросЗалыССовпадением', 'U') IS NOT NULL
  DROP TABLE #ЗапросЗалыССовпадением; 
SELECT     Зал.[ID отеля] AS ОтельID, ЗалID, ЗалНазвание, СовпадениеВысотаПотолка, СовпадениеВысотаПотолка AS ОбщееСовпадениеЗала
INTO       #ЗапросЗалыССовпадением
FROM       Зал INNER JOIN #ЗапросЗалыСовпадениеВысотаПотолка
                ON Зал.ID = #ЗапросЗалыСовпадениеВысотаПотолка.ЗалID;
 
 
IF OBJECT_ID('tempdb.dbo.#ЗапросОтельКоличествоПодходящихЗалов', 'U') IS NOT NULL
  DROP TABLE #ЗапросОтельКоличествоПодходящихЗалов; 
SELECT ОтельID, Отель.Название AS ОтельНазвание, Count(ЗалID) AS КоличествоПодходящихЗалов
INTO #ЗапросОтельКоличествоПодходящихЗалов
FROM Отель INNER JOIN #ЗапросЗалыССовпадением
           ON Отель.ID = #ЗапросЗалыССовпадением.ОтельID
WHERE #ЗапросЗалыССовпадением.ОбщееСовпадениеЗала >= @НеобходимоеСовпадениеЗалов
GROUP BY ОтельID, Отель.Название;
Но вложенные запросы и временные таблицы не поддерживают сортировки ORDER BY.
Использование переменных через DECLARE требует большой рутины по описанию результирующей таблицы:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DECLARE @TempЗал TABLE
(
    [ID]                        INT,
    [Название]              NVARCHAR (50),
    [Высота потолка]     INT
);
INSERT INTO 
    @TempЗал 
SELECT 
    ID, 
    Название,
    [Высота Потолка]
FROM 
    Зал
ORDER BY [Высота потолка];
При этом оба способа выполняют запросы сразу, используя много дополнительной памяти.
Так, как правильно разбивать сложные запросы на мелкие логические части, чтобы была возможность использовать ORDER BY и желательно иметь преимущества отложенных вычислений, экономии памяти?
Ответ: Затруднения в этом:
1. Невозможно сделать несколько запросов к одному CTE, приходится использовать табличные переменные;
2. CTE не поддерживают ORDER BY;
3. Как оптимально сохранить эти запросы на сервере?
а) View не поддерживают объявление переменных и ORDER BY;
б) View и функции не позолят вернуть сразу 2 запроса - отели и подходящие залы.
Посмотрите, пожалуйста, запросы, чтобы понять проблемы:
Вопрос: Запрос с временнЫми периодами

Здравствуйте!

Помогите, пожалуйста, составить запрос(ы).

Система определения "популярности" записей форума.

Одна таблица:
CREATE TABLE IF NOT EXISTS `popular_topics` (
topic_id INT(20) NOT NULL,
date DATETIME NOT NULL,
KEY topic_id (topic_id)
) DEFAULT CHARSET=utf8;

При каждом посещении пользователями страницы топика, в базу пишется ID топика и время посещения.

На выходе нужно получить список из 5-ти топиков (topic_id), с максимальным количеством посещений, отсортированный по этому количеству по убыванию и за нужный период времени.

Временные периоды могут быть следующие:
1) за сутки
2) за неделю
3) за месяц
4) за все время

Спасибо!
Ответ: Akina, спасибо, просто неимоверно помогли, особенно с COUNT.
Вопрос: Слияние колонок таблицы

Как в запросе выполнить слияние колонок одной таблицы, например есть таблица с двумя полями
ID Name
1 One
2 Two
3 Three

А необходимо получить одно поле
NewCol
1-One
2-Two
3-Three
Ответ:
varvest
Спасибо! Но в SQL сервере работает, а в 1с нет :(
Про запросы из 1С надо спрашивать в разделе по 1С, а не тут. В 1с свой диалект, который работает не только на MS SQL.
Вопрос: Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)

Ребята, перерыл интернет на предмет наличия универсального способа обработки SYS_REFCURSOR. Наткнулся здесь, мол можно через pipelined (попробовал, но предопределение столбцов не устраивает), через ODCI - увы очень мало информации об этом и в основном на аглицком. А я с ним очень плохо дружу! Нужна помощь! Кто может сталкивался, кто что знает - буду рад любой информации!

Собственно что я хочу:

rec1 sys_refcursor

select * from rec1

Уже была , но там пользователь с ником dbms_photoshop написал
dbms_photoshop
1. Самый банальный способ - pipelined. Ищи в доке и гугле.
2. Самый универсальный - odcitable. Ищи в доке и гугле.
3. Самый извращенный - XML. Ищи в форуме.


и больше ничего не говорил об этом. А меня именно заинтересовал второй способ!!! Все потом вертелось вокруг pipelined функции. Так как автора того поста это устраивало - на этом они и остановились. А я вот нехочу каждый раз предопределять параметры (ленивый я, да...) и хочу один раз написать процедурину или пакет и пользоваться им заменяя километровые коды описания временных таблиц или что еще хуже создание физических таблиц - двумя строчками!

Может я плохо искал (вроде нет), может я неправильно задавал вопросы в гугле - но в результате я не смог пробиться дальше чем 3-4 основных моментов создания ODCI Table.
Ответ:
SerjantGB
Нужен совет, как правильно
Тебе уже два человека озвучили в каком направлении двигаться. Но поскольку ты не согласен, то тебе остаётся надеяться что в топик заглянет кто-то еще знающий ODCITable и либо разделяющий твои взгляды по поводу костылей либо просто желающий помочь тебе выстрелить самому себе в ногу.

PS. Видимо ты совсем плохо понимаешь что такое реф курсор и что значит "работает технология с точностью до хард парса".
У тебя ничего не получится с таким уровнем понимания, но может что новое узнаешь. Пилите, Шура, пилите.
Вопрос: Объединение всех полей в перекрёстном запросе

Здравствуйте!
Подскажите пожалуйста:
имеется перекрёстный запрос, в котором столбцы именуются: 1, 2, 3, 4, 5...
можно ли в конструкторе перекрёстного запроса создать выражение, чтобы значение этого столбца равнялось самому себе & тому, которое в предыдущем поле?
или может имеются варианты реализовать это не с полями, а со строками. это даже надёжнее, так как не ограничено 255 размером

заранее спасибо!
Ответ:
Сообщение от shanemac51
выложите более реальный пример базы(структура таблицы и значность данных)
спасибо, наверное не стану. до меня наконец дошло, что глупую задачу ставил... вернее не задачу, а способ реализации )
мне подсказали конканацию (слияние) строк через запросы.... на нём и буду рад)
Вопрос: Параллельные запросы OeBS и direct path read

Есть PL\SQL процедура, в которой я проставляю параметр _serial_direct_read = always на уровне сессии, и выполняю динамический insert ... select ... . В select'е производится полное сканирование ряда таблиц. Имеется параллельный запрос, созданный на основе этой процедуры. Если я запускаю процедуру из какого-нибудь SQL Navigator'а или PL\SQL Developer'а, (declare begin <вызов процедуры> end;), то сканирование производится через direct path read, а если запускаю параллельный запрос, то только через db file scattered read.
Может ли кто-нибудь подсказать, почему так происходит и можно ли это исправить?
Oracle 11.2.0.4.0
Oracle Applications : 12.1.3
Ответ: Прошу прощения, ввёл в заблуждение. Пареллельный запрос основан не на процедуре, а на rdf-отчёте, который вызывает процедуру в триггере BeforeReport. Вызов происходит через call (в трассировочном файле: RPC CALL:APPS.XX...), а в таких случаях direct path read не работает.
"Direct path reads are not enabled for the SQL in a PLSQL when the PLSQL package is called by 'CALL plsql' from sqlplus." (Doc ID 15882436.8)
Вопрос: Как из перекрестного запроса создать таблицу?

Проблема следующая (часто встречающаяся):

Руководитель вводит данные (например в Excel) как ему хочется и заставить вводить его по-человечески невозможно. Считает, что лучше чем он, данные представлять никто не умеет. Как правило записывает он их в виде перекрестной таблицы, т.е. в первые несколько столбцов - заголовки строк, в оставшиеся столбцы заголовки столбцов (значения какого-либо параметра), а в ячейках таблицы - значения (как правило не статистически обработанные, а просто для данного пересечения значений строк и столбцов существует только одно значение).
Эти данные потом нужно обрабатывать.
Поэтому появляется задача из данной перекрестной таблицы получить нормальную таблицу, в которой бы присутствовало поле используемое как источник заголовка столбцов, а сами заголовки столбцов, как значения данного поля.
Все бы получилось, но одна загвоздка: не могу получить названия заголовков столбцов (название полей) в качестве значения поля (в запросе).
При этом знаю, что в конструкторе таблицы на вкладке "Подстановка" как-то реализована возможность получения списка названия полей таблицы.
Может какая-то функция есть?
Помогите, пожалуйста, кто знает.

С уважением, Морозов Сергей
Ответ: Private Sub Кнопка0_Click()


'Dim obj
' obj = GetObj()

Dim rst As DAO.Recordset
Dim sSql As String
Dim sFileName As String
Dim i As Integer



Set xlApp = CreateObject("Excel.Application.14")
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Worksheets(1)

sFileName = CurrentProject.Path & "\" & "Документы_FI.xlsx"

Set rst = CurrentDb.OpenRecordset("BKPF_BSEG_2016", , dbOpenTable)
i = 1
xlApp.Visible = True
For Each fld In rst.Fields
' MsgBox fld.Name & " - " & fld.Type
xlWs.Range(xlWs.Cells(1, i), xlWs.Cells(1, i)).Value = fld.Name
i = i + 1
Next




xlWs.Range("A2").CopyFromRecordset rst

sFileName = CurrentProject.Path & "\" & "BKPF_BSEG_2016_" & Format(Date, "dd.mm.yy") & "_" & Format(Time, "hh-mm") & ".xlsx"
xlWs.SaveAs sFileName

End Sub
Вопрос: Табличная переменная VS вложенный запрос

Добрый день!

Отлаживая запрос, наткнулся на неожиданную ситуацию.
Работа с табличной переменной в mssql 2016 происходит на порядки дольше.
Был подготовлен тестовый скрипт:

DECLARE @CurrentDate DATE = '2017-02-15'

-- Определение границ прошлого месяца
DECLARE @LeftDateTimeMargin  DATETIME = DATEADD(MONTH, DATEDIFF( MONTH, 0, @CurrentDate )-1, 0)
DECLARE @RightDateTimeMargin DATETIME = DATEADD(MONTH, DATEDIFF( MONTH, 0, @CurrentDate ),   0)

-- debug 
-- SELECT @CurrentDate as CurrentDate, @LeftDateTimeMargin as LeftDateTimeMargin, @RightDateTimeMargin as RightDateTimeMargin

-- Создание табличной переменной для сохранения выборки данных за целевой период
DECLARE @SourceData TABLE (
	[id] [uniqueidentifier] NOT NULL PRIMARY KEY,
	[event_datetime] [datetime] NOT NULL,
	[base_id] [uniqueidentifier] NOT NULL,
	[event_id] [uniqueidentifier] NOT NULL,
	[user_id] [uniqueidentifier] NULL,
	[metaname] [nvarchar](300) NOT NULL,
	[duration] [int] NULL,
	[product_id] [uniqueidentifier] NOT NULL,
	[server_event_datetime] [datetime] NOT NULL,
	[aeh_id] [uniqueidentifier] NULL
)

-- Заполнение табличной перемнной данными с отбором (число строк = 6 599 436)
INSERT INTO @SourceData (
	[id],
	[event_datetime],
	[base_id],
	[event_id],
	[user_id],
	[metaname],
	[duration],
	[product_id],
	[server_event_datetime],
	[aeh_id]
) SELECT 
	[id],
	[event_datetime],
	[base_id],
	[event_id],
	[user_id],
	[metaname],
	[duration],
	[product_id],
	[server_event_datetime],
	[aeh_id]
FROM [StatSoftwareUsageData]
WHERE
	server_event_datetime >= @LeftDateTimeMargin AND
	server_event_datetime <  @RightDateTimeMargin

-- ОЧЕНЬ ДОЛГО РАБОТАЕТ, БОЛЕЕ 20+ МИНУТ - в качестве источника, заранее подготовленная выборка
-- При исполнении запроса, sqlservr грузит 1 ядро на 100%

SELECT
	DISTINCT [@SourceData].[metaname]
FROM @SourceData
LEFT JOIN [StatMetanames] ON [StatMetanames].[metaname] = [@SourceData].[metaname]
WHERE
	[StatMetanames].[id] IS NULL

-- РАБОТАЕТ НОРМАЛЬНО (20 сек) - в качестве источника, обычная таблица
-- При исполнении запроса, sqlservr грузит все ядра

--SELECT
--	DISTINCT [StatSoftwareUsageData].[metaname]
--FROM [StatSoftwareUsageData]
--LEFT JOIN [StatMetanames] ON [StatMetanames].[metaname] = [StatSoftwareUsageData].[metaname]
--WHERE
--	[StatMetanames].[id] IS NULL AND
--	server_event_datetime >= @LeftDateTimeMargin AND
--	server_event_datetime <  @RightDateTimeMargin

Понятно, что по строке соединяться - не самая лучшая затея. Но вопрос не в этом.
Вопрос - почему такая существенная разница, при работе с одинаковым числом записей?
Табличная переменная на порядки медленнее чем запрос к исходной таблице.
Есть ли возможность как-то использовать табличные переменные, не теряя производительность?
Почему грузится 1 ядро при работе с табличной переменной?

Казалось бы, табличная переменная целиком в памяти, вместо того, чтобы 10 раз прицеплять вложенный запрос к исходной таблице,
должно быть лучше создать 1 раз нужную выборку и везде её использовать...
Ответ: Нектотам,

Нектотам
2. Какая структура у StatSoftwareUsageData и какие индексы?
Поля 1 в 1 как у @SourceData, индекс кластеризованный на [id] и не кластеризованный на [server_event_datetime].

Нектотам
3. В случае с табличной переменной вы читаете из StatSoftwareUsageData и пишите в @SourceData 10 колонок, а в простом запросе - 2.
Выполняется 20 минут инструкция после комментария (@SourceData заполняется достаточно быстро).
При этом, если в быстром запросе добавить все колонки из медленного, скорость исполнения не меняется.

Нектотам
4. Табличная переменная живет в tempdb. Это вполне может привести к большим IO.
Разве не временные таблицы живут в TempDB? Тогда как табличные переменные в памяти?
В IO сервер не упирается при исполнении медленного запроса.

автор
5. В случае с табличной переменной сначала надо выгрести все записи, а потом уже делать join.
Причина, почему в табличной переменной много колонок, в то время, как тестовый запрос использует только одну -
это тестовый запрос, тут минимум кода, но результрующая выборка со всеми колонками может использоваться.
Т.е. идея заключалась в том, чтобы 1 раз сформировать выборку (а ведь она может быть сложной и долгой), положить результат куда-то и при необходимости использовать, вместо того, чтобы заново формировать выборку.

автор
6. В случае с табличной переменной оптимизатор часто промахивается, особенно без option(recompile), т.к. статистики по табличной переменной нет.
Спасибо!
Добавление "OPTION (RECOMPILE)" к медленному запросу полностью устраняет разницу, одновременно с этим исполнение параллелится.
Это правильный ответ на вопрос.

Теперь хоть понятно откуда и почему возникает разница в тестовом запросе.

TaPaK
Спасибо.

aleks2
Никогда не понимал таких людей.
Ты поди эксперт во всём, раз допускаешь такие комментарии.
Опимизация тестового примера не дает ответ на вопрос.