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

Надо сделать таблицу в которой бы отображались два перекрестных запроса. 1 перекрестный запрос + сумма по столбцам. Запрос на сумму должен стать перекрестным именно в момент запроса, не раньше. Получилось 2 отдельных запроса - на сумму, и перекрестный как теперь сделать под перекрестным запросом, запрос на сумму перекрестный в одной таблице? В Union надо 3 столбца дописать.
Можно ли как-то связать UCHET_ED который есть в двух запросах. Т.К. нужно 2 строки(шапки) подряд один из которых порядковый номер id (UCHET_ED), а второе имя (ED.name). Еще я сталкиваюсь с такой проблемой что сумма в разных столбцах таблицы появляется. Поэтому надо как-то привязать uchet_ed
Вот как это должно выглядеть примерно:

|__name1___name2___name3___| ED.name
|___01______02______03______| UCHET_ED
|___35______12______24______| тут уже числа идут
|___20______10______1_______|
|___55______22______25______| тут сумма этих чисел


Вот как у меня получается
|__name1___name2___name3___| ED.name
|___01______02______03______| UCHET_ED
|___35______12______24______| тут уже числа идут
|___20______10______1_______|
|___25______55______22______| тут сумма этих чисел

Запрос перекрестный

TRANSFORM Sum(count_obr.[Count-UCHET_ED]) AS [Sum-Count-UCHET_ED]
SELECT count_obr.CODE, count_obr.SPV01502.name, count_obr.Выражение1
FROM count_obr
GROUP BY count_obr.CODE, count_obr.SPV01502.name, count_obr.Выражение1
PIVOT count_obr.ed.name;



Запрос на сумму
SELECT [%$##@_Alias].UCHET_ED, Sum([%$##@_Alias].[Count-UCHET_ED]) AS SUMMA
FROM (SELECT count_obr.LPU_ID, count_obr.Выражение1, count_obr.UCHET_ED, count_obr.[Count-UCHET_ED] 
  FROM count_obr 
  GROUP BY count_obr.LPU_ID, count_obr.Выражение1, count_obr.UCHET_ED, count_obr.[Count-UCHET_ED])  AS [%$##@_Alias]
GROUP BY [%$##@_Alias].UCHET_ED, [%$##@_Alias].Выражение1, [%$##@_Alias].LPU_ID;



Огромное спасибо, тем , кто напишет !
Ответ:
reaxson
Может не все поняли я делал запрос на сумма перекрестным и в другом запросе только объединял, но мне надо это сделать все в одном запрос объединение + перекрестный и чтобы столбцы совпадали по id name
.


наверняка есть екселевская простыня-аналог требуемого
она очень бы помогла в анализе желаемого
Вопрос: Процедура, принимающая в качестве параметров - две таблицы

Здравствуйте, прошел курс по T-SQL. Стоит задача создать хранимую процедуру, которая принимает, в качестве параметров, две совместимые по типу таблицы и выполняет реляционную операцию объединения, по некоторому условию.

Не совсем понимаю, ранее выполнял подобное задание, но процедура принимала хранимые пользовательские переменные табличных типов. Вот пример:

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*Создание табличного типа данных tab1*/
USE LR5
if TYPE_ID('dbo.tab1') is not null
drop type dbo.tab1
go
create type dbo.tab1 as table
(id_d int not null primary key,
name_d varchar(30) not null,
hours_d int not null,
fio_p varchar(30) not null)
 
/*Создание табличного типа данных tab2*/
USE LR5
if TYPE_ID('dbo.tab2') is not null
drop type dbo.tab2
go
create type dbo.tab2 as table
(id_s int not null primary key,
fio varchar(30) not null,
avg_ball float null)
 
 
 
if OBJECT_ID('dbo.p4') is not null
drop proc dbo.p4
go
create proc dbo.p4
@tab2 dbo.tab2 readonly,
@tab1 dbo.tab1 readonly
as
begin
select * from @tab1
cross join
@tab2
end
 
USE LR5
declare @t1 as dbo.tab1
declare @t2 as dbo.tab2
insert into @t1 select * from dbo.disciplines
insert into @t2 select * from dbo.students3 
exec dbo.p4 @tab2=@t2, @tab1=@t1
Будет ли верно, если я точно так же сначала сделаю табличный тип данных и в процедуру буду отправлять переменную или от меня требуется непосредственно таблицу в процедуру отправлять? Если в качестве параметров необходимо (если это возможно) принимать непосредственно таблицы - подскажите, пожалуйста, как правильно это делать?
Ответ:
Сообщение от Famous_47
в чем неправильность отправки в процедуру переменных табличного типа?
Подумайте зачем для выполнения запроса из двух таблиц делать копии этих самых таблиц.
Вопрос: Создание запроса на объединение двух других запросов

Добрый день.
Подскажите решение в следующей ситуации.
Есть два сложных запроса на выборку (включающие подзапросы) по трём связанным таблицам.
Их результатами являются Таблица1 и Таблица2.
Для окончательного отчета нужно объединить в одной таблице (Таблица3) ВСЕ записи Таблицы1 и Таблицы2. Но таким образом, чтобы в каждой записи Таблицы3 были ВСЕ поля (столбцы) Таблицы1 и Таблицы2. При этом заполнялись значения только одной из таблиц, т.е. если добавляется запись со ЗНАЧЕНИЯМИ из Таблицы1, то поля соответвующие Таблице2 остаются пустыми (не заполненными) и наоборот, при заполнении полей (столбцов) значениями Таблице2 остаются пустыми поля соответствующие Таблице1.
Извиняюсь за путанное описание, но из скринов будет понятнее.
Спасибо.
Ответ:
Сообщение от mobile
Попробуйте запрос
Однако...
Работает без вопросов
Осталось теперь понять механизм этого запроса на объединение.
mobile, большое спасибо!
Вопрос: Сравнение двух планов запроса (9.7 и 9.1)

Сравниваю два плана запросов в БД 9.1 и 9.7, полученные в IBM DATA STUDIO:
Первый в 9.1:
Картинка с другого сайта.
Второй в 9.7:
Картинка с другого сайта.

Таблицы одни и те же, набор индексов одинаковый, статистика на всех собрана. Индексы, судя по планам, используются одни и те же.

Подскажите плиз, неужели разница из-за версий? Или что-то с package, используемым?
Ответ: Приношу свои извинения за введение в заблуждение, на нижнем скрине была Стоимость, а на верхнем - Мощность.
Но тогда еще один глупый вопрос, а где в IBM DATA STUDIO выставляется именно для базы в Наглядном объяснении, что будет выдаваться, потому что нужно мне одинаковое все-таки что было, а найти никак не получается, где Настройки именно для Наглядного объяснения.
Вопрос: Объединение двух связанных запросов

Доброго времени суток.
Помогите пожалуйста с SQL запросом для выборки двух взаимосвязанных запросов.

То есть в БД существуют 3 взаимосвязанных таблиц:

Таблица "Заказ" - хранятся заказы с датами предполагаемых заказов и номера на которые поступили заказы
Таблица "Номер" - список номеров гостиницы
Таблица "Класс обслуживания" - дополнительный описательный список класса номера (стоимость и т.д. и т.п.)


Так вот, мне нужно получить список номеров, которые свободны на заданный промежуток времени, в список должны включаться:
  • Номер.[Гостинничный номер]
  • [Класс обслуживания].Описание
  • [Номер].[Вид из окна]
  • [Класс обслуживания].[Стоимость номера]

На данный момент я сделал получение списка свободных номеров без описания (просто номера):
SQL
1
2
3
4
5
6
SELECT Номер.[Гостинничный номер]
FROM Номер
WHERE (((Номер.[Гостинничный номер]) NOT IN (
              SELECT Заказ.[Гостинничный номер]
              FROM Заказ
              WHERE (((Заказ.[Дата прибытия]) BETWEEN #11/1/2016# AND #11/3/2016#) AND ((Заказ.[Дата выезда]) BETWEEN #11/1/2016# AND #11/3/2016#) ) ) ) )
Но как бы я ни старался, я не могу выбить описание из вспомогательной таблицы "Класс обслуживания".

Подскажите пожалуйста как вывести данные описания.
Ответ: Ахахах.

Да, вы были правы!

Моя грубейшая ошибка - невнимательность. При тестировании вашего запроса я попросту вводил с клавиатуры его, в следствии чего мною была допущена ошибка - изменил местами даты которые вы приводите в своём запросе.
Из-за невнимательности пришлось делать костыли.

Спасибо большое!
Вопрос: Разное время одного и того же запроса включая explain analyze

На сервере СУБД Postgresql 9.6.1 запускаю psql и выполняю один и тот же запрос, который то отрабатывает за 5-7 секунд, то висит по нескольку часов. Блокировок нет, по крайней мере я их не наблюдаю.
Не понятна картина происходящего.

db1=# explain analyze select *,  shirota as latitude, dolgota as longitude
from some.journal(null,null,null,to_timestamp('09.10.2018 00:00:00','DD.MM.YYYY HH24:MI:SS')::timestamp,
to_timestamp('12.10.2018 20:59:59','DD.MM.YYYY HH24:MI:SS')::timestamp,null,null::varchar,null)
order by some_date desc limit 10;

                                                               QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=31.87..31.89 rows=10 width=696) (actual time=6992.614..6992.618 rows=10 loops=1)
   ->  Sort  (cost=31.87..34.37 rows=1000 width=696) (actual time=6992.612..6992.613 rows=10 loops=1)
         Sort Key: some_date DESC
         Sort Method: top-N heapsort  Memory: 29kB
         ->  Function Scan on journal  (cost=0.26..10.26 rows=1000 width=696) (actual time=6609.147..6819.728 rows=268444 loops=1)
 Planning time: 0.168 ms

Execution time: 7019.588 ms
(7 rows)

Тот же запрос, но время выполнения больше часа. Количество обрабатываемых строк одно и тоже.

db1=# explain analyze select *,  shirota as latitude, dolgota as longitude
from some.journal(null,null,null,to_timestamp('09.10.2018 00:00:00','DD.MM.YYYY HH24:MI:SS')::timestamp,
to_timestamp('12.10.2018 20:59:59','DD.MM.YYYY HH24:MI:SS')::timestamp,null,null::varchar,null)
order by some_date desc limit 10;

                                                                  QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=31.87..31.89 rows=10 width=696) (actual time=4122829.020..4122829.024 rows=10 loops=1)
   ->  Sort  (cost=31.87..34.37 rows=1000 width=696) (actual time=4122829.019..4122829.019 rows=10 loops=1)
         Sort Key: some_date DESC
         Sort Method: top-N heapsort  Memory: 29kB
         ->  Function Scan on journal  (cost=0.26..10.26 rows=1000 width=696) (actual time=4122477.150..4122666.161 rows=268444 loops=1)
 Planning time: 0.189 ms

Execution time: 4122855.497 ms
(7 rows)

В чём может быть причина?
По БД собирал статистику (analyze), делал vacuum full. По CPU виртуальная машина загружена на 45-50%.
Явного свопа не наблюдаю. По дискам тоже не сказать, что есть проблема.

Запрос рандомно, то отрабатывает, то напрочь зависает.
Ответ:
BigBudda

Тогда запрос запихивает в кэш 180841652 * 8 Кб = 1379 Гб?!

Buffers: shared hit=180841652, temp read=58312 written=45096

нет. он берет из кеша в сумме стока сколько хит. вероятно многократно повторно одно и то же.
то что он читает с диска -- это рид. пишет -- вриттен.


т.к. в буферсах явной работы с диском нет, то он либо рабртает с ним неявно (своп) либо планы внутре скачут.

теперь представьте, что он произвольным доступом кладет и берет это вот все мимо тазика -- т.е. из ваших 64МБ свопа. и так 100500 раз. т.е. по полоборота на каждый доступ. вот оно то и набежит за 180лямов доступов.

хотя это вольный домыысел. и при таких объёмах вычислений без ридов все мможет зависеть от плана счета. как говорит максим.
Вопрос: Один и тот же запрос, разное время выполнения

Добрый день!

Вопрос, почему один и тот же запрос, например - select * from table1 where colum1 = '1'
в первый раз выполняется за 0,275 - 0,350 мс, а в следующий раз за 0,050-0,075 мс.
Значения чередуются при каждом запросе, то больше, то меньше и ни когда два раза под ряд не имеем варианта
из большего диапазона, так и из меньшего.

Более сложные запросы выполняются точно так же, есть большой диапазон, есть малый, и каждый раз выполняя запрос
я вижу чередование.

С чем это может быть связано?

Использовал MS SQL Server 2008 и 2012, разницы нет.
Ответ: наличие ресурсов
Вопрос: в Toad и SQLPlus один и тот же запрос возвращает разный результат

Один и тот же запрос в Toad возвращает одну строку, в sqlplus дубль.
Почему так?
в Toad запрос запускается стандартным способом. вручную, в sqlplus через @, так:
sqlplus user/password@db @myquery.sql
Если я правильно догадываюсь, ответ кроется в кодировке.
В бд al32utf8, пробовал в батнике исполняемом писать set nls_lang=al32.utf8, не помогло.
При чем что интересно:
Если скопипастить запрос и вволнить его в строке sqlplus, один результат, запустить в sqlplus через @ другой результат. Подскажите как быть.
На выходе мне нужно получить файл с русскими буквами и без дублей.
Ответ: 31,

синтаксис надо блюсти и как минимум - понимать, что делаете
Вопрос: Непростые запросы

Приветствую.

Подскажите софт для запросов.
Есть произвольная база данных в mysql из которой хочется извлекать информацию в виде различных отчетов. Простые запросы к базе не решают задачу, т.к. нет удобства «переходов» от уже полученных результатов к новым запросам.
Надо чтобы работало это так: делаем какой-то запрос, например select * из БД. Сохраняем его, как-то называя. И запускаем. Он выдает нам результаты, при этом мы можем удобно пользоваться сортировками этих самых результатов, у них есть разбивка по страницам, фильтры всяческие, экспорт и прочее.
Далее на любое поле, выдаваемое нам как результат, мы можем привязывать один или несколько разных запросов с использованием результатов по этому полю (на которое кликнули мышкой) в качестве одной из переменных этого самого нового запроса (или запросов).
Например, в результате запроса select * одно из полей БД – имя юзера. К имени юзера я хочу привязать 2 новых запроса (кнопочками прям рядом с ним, или по правой кнопке..), один из которых будет выдавать мне из другой таблицы его персональные данные, а второй - все его заходы в систему. Еще у запросов надо чтобы задавались в качестве переменных какие-то изменяемые значения, например временные интервалы.

Из того что сам пробовал, более всего понравился dbForge Studio и вроде как там с помощью "Дизайнер запросов" многое возможно, но все же не получилось.
Ответ:
Jesprit
Приветствую.

Подскажите софт для запросов.
Есть произвольная база данных в mysql из которой хочется извлекать информацию в виде различных отчетов. Простые запросы к базе не решают задачу, т.к. нет удобства «переходов» от уже полученных результатов к новым запросам.
Надо чтобы работало это так: делаем какой-то запрос, например select * из БД. Сохраняем его, как-то называя. И запускаем. Он выдает нам результаты, при этом мы можем удобно пользоваться сортировками этих самых результатов, у них есть разбивка по страницам, фильтры всяческие, экспорт и прочее.
Далее на любое поле, выдаваемое нам как результат, мы можем привязывать один или несколько разных запросов с использованием результатов по этому полю (на которое кликнули мышкой) в качестве одной из переменных этого самого нового запроса (или запросов).
Например, в результате запроса select * одно из полей БД – имя юзера. К имени юзера я хочу привязать 2 новых запроса (кнопочками прям рядом с ним, или по правой кнопке..), один из которых будет выдавать мне из другой таблицы его персональные данные, а второй - все его заходы в систему. Еще у запросов надо чтобы задавались в качестве переменных какие-то изменяемые значения, например временные интервалы.

Из того что сам пробовал, более всего понравился dbForge Studio и вроде как там с помощью "Дизайнер запросов" многое возможно, но все же не получилось.



вы описали уже задание на некую интерактивную
юзер-френдли системку, некий дашбоард / интерактивный репорт.
Или сами кодируйте на php, ruby или посмотрите PowerBI,
MicroStrategy Desktop, Excel и еще много более платных систем.
Вопрос: разные планы выполнения одного запроса - как заставить CBO взять правильный? (10g!)

один и тот же запрос выполняю в SQL Plus (выполняется отлично!) и в моей программулине (выполняется плохо). В V$SQLAREA вижу два SQL_ID с разными планами выполнения. Разница в планах (смотрел dbms_xplan.display_cursor('5nx8hn25yux4b','','typical')) видна невооруженным глазом: хороший берет селективный индекс в большой таблице (в предикате стоит соответствующий критерий Х), а плохой отчего-то не признает индекс (в предикате критерий X появляется не сам по себе, а вместе с другими условиями, что приводит к TABLE ACCESS FULL). Статистики пересобирал с инвалидацией - результат нулевой. Что еще можно посмотреть, например в V$SQLAREA, чтобы понять, откуда/почему берется неправильный план и как заставить CBO взять правильный?
Ответ:
Задвинутый чайник
один и тот же запрос выполняю в SQL Plus (выполняется отлично!) и в моей программулине (выполняется плохо). В V$SQLAREA вижу два SQL_ID с разными планами выполнения.

Две строки в V$SQLAREA, два разных SQL_ID ==> два разных запроса.
Один запрос с несколькими планами - это одна строка в V$SQLAREA, один SQL_ID, несколько строк в V$SQL.