Size: a a a

SqlCom.ru - уголок MS SQL

2021 June 10

Л

Лучший ник in SqlCom.ru - уголок MS SQL
Переслано от Лучший ник
Подскажите пожалуйста, как сделать 3 Pivot-a подряд?
Первый Pivot у меня считает EnergyValue по датам которые в переменной @pt.
Мне нужно как-то сделать второй и третий PIVOT которые по этой же дате посчитают другие столбцы
источник

Л

Лучший ник in SqlCom.ru - уголок MS SQL
Переслано от Лучший ник
Мне до этого не приходилось работать более чем с одним Pivot-ом
источник

KT

Konstantin Taranov in SqlCom.ru - уголок MS SQL
источник

Л

Лучший ник in SqlCom.ru - уголок MS SQL
а я так и сделал,но чёт не работает. Буду проверять ещё
источник

АР

Александр Ройтман... in SqlCom.ru - уголок MS SQL
declare @t table (d date, a int, b int, c int);
insert into @t
values
('2021-01-01', 1, 2, 3), ('2021-01-01', 4, 5, 6),
('2021-02-01', 7, 8, 9), ('2021-02-01', 10, 11, 12);

with t1 as
(
select
 row_number() over (order by 1/0) as rn, p.*
from
 (select d, a from @t where d in ('2021-01-01', '2021-02-01')) t
 pivot
 (
  sum(a) for d in ([2021-01-01], [2021-02-01])
 ) p
),
t2 as
(
select
 row_number() over (order by 1/0) as rn, p.*
from
 (select d, b from @t where d in ('2021-01-01', '2021-02-01')) t
 pivot
 (
  sum(b) for d in ([2021-01-01], [2021-02-01])
 ) p
),
t3 as
(
select
 row_number() over (order by 1/0) as rn, p.*
from
 (select d, c from @t where d in ('2021-01-01', '2021-02-01')) t
 pivot
 (
  sum(c) for d in ([2021-01-01], [2021-02-01])
 ) p
)
select
*
from
t1 join
t2 on t2.rn = t1.rn join
t3 on t3.rn = t1.rn;
источник

AB

Andrey Borodavko in SqlCom.ru - уголок MS SQL
Уважаемые коллеги - имею проблему: на один и тот же сервер бд, с одинаковыми запросами обращаюсь с разных серверов приложений (.Net 5). И имею разную скорость выполнения по данным sql и данным приложения (которые коррелируют с реальностью).
Конкретно, с точки зрения профайлера, запрос выполняется за 150 мс, а с точки зрения статистики SQL client - класса в дотнете - 600 мс. Ну и реальная цифра и есть эти 600 мс.
Причем когда я запускаю приложение со своего локального хоста - то получаю нужные 150 мс, а с серверов - 600 мс.
При этом есть вторая бд с теми же самыми данными и вроде такими же настройками и мощностями, на которой таких проблем нет.
Sql server 2019, win server 2019, 128 gb/8 vcpu/ssd, базы - два одинаковых подписчика одной репликации транзакций
источник

AB

Andrey Borodavko in SqlCom.ru - уголок MS SQL
Может есть какие-то ещё способы замера времени, понять где что теряется?
источник

СС

Сергей С. in SqlCom.ru - уголок MS SQL
должна ли работать такая конструкция?
SELECT t1.a,
      t1.b,
      t1.c
FROM TABLE t1 OUTER apply
 (SELECT iif (
                (SELECT top 1 t2.a, t2.b
                 FROM TABLE t2
                 WHERE t2.a = t1.a
                 ORDER BY t1.b) = (t1.a, t1.b) , 1, 0)) x
источник

СС

Сергей С. in SqlCom.ru - уголок MS SQL
то есть делаю селект, к нему аутер эпплай единицу или ноль, в зависимости от того, равен ли результат внутреннего селект топ 1 тому, что во внешнем селекте
источник

К

Какой-то Хмырь... in SqlCom.ru - уголок MS SQL
мб накладные расходы на передачу по сети?
источник

AB

Andrey Borodavko in SqlCom.ru - уголок MS SQL
Я тоже об этом думал, но тогда бы имел эти цифры в 600 мс либо со всех устройств, либо на все базы данных с сервера приложений
источник

ВБ

Владимир Боярских... in SqlCom.ru - уголок MS SQL
Что мешает проверить?
источник

СС

Сергей С. in SqlCom.ru - уголок MS SQL
ошибка синтаксиса, не понимаю что не так..
источник

AB

Andrey Borodavko in SqlCom.ru - уголок MS SQL
Даже если так, то по идее бы я видел в статистике sql client время выполнения 150 мс (как в профайлере), а какой-нибудь network time эти 600 мс
А так время выполнения тоже 600 :(
источник

ВБ

Владимир Боярских... in SqlCom.ru - уголок MS SQL
Ну значит не работает. Кортежи не завезли ещё в SQL.
источник

СС

Сергей С. in SqlCom.ru - уголок MS SQL
и правда не завезли
как это лучше переписать тогда? есть мысль засунуть with cte as внутрь outer apply  , из cte селектить с кейсом и сравнивать со значением в t1
сорри, если оч криво описал
источник

АР

Александр Ройтман... in SqlCom.ru - уголок MS SQL
См. статистику выполнений запроса в sys.dm_exec_query_stats
Там есть *worker_time и *total_time
Соответственно, worker - сколько потрачено CPU на выполнение запроса, а total-worker - различные ожидания (блокировки, передача данных клиенту и т.п.)
источник

СС

Сергей С. in SqlCom.ru - уголок MS SQL
кажется это в sql server тоже нельзя сделать
источник

АР

Александр Ройтман... in SqlCom.ru - уголок MS SQL
Примерно так

SELECT t1.a,
      t1.b,
      t1.c
FROM TABLE t1 OUTER apply
(select top (1) t2.a, t2.b FROM TABLE t2 WHERE t2.a = t1.a ORDER BY t1.b) a cross apply
(SELECT iif (exists(SELECT a.a, a.b intersect select t1.a, t1.b) , 1, 0)) x
источник

AB

Andrey Borodavko in SqlCom.ru - уголок MS SQL
там вроде как цифры как в профайлере, плюс там цифры по подзапросам, а общей цифры нету.
источник