powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите с запросом с двумя select
25 сообщений из 74, страница 2 из 3
Помогите с запросом с двумя select
    #39164300
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мощности серверу добавить сложнее. Ограничения сервера не столько в процессорном времени, сколько в блокировках. Если более сложный запрос дольше держит блокировку, то доп.ядра тут не помогут.

А клиентам хз зачем наращивать, у них обычно проц простаивает.

Насчет трафика непонятно. Например, если задача стоит возвращать количество и цену или количество, цену и сумму, то трафик больше при расчете на сервере.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164305
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю твою иронию специалиста по крупным проектам ))
Вступать в дискуссию - как правильно, как лучше и т.п. не хочу, это оффтопик здесь будет. Просто отвечу на твой вопрос.

На сервере просто следил за загрузкой процессора и дисков. Когда год назад мне перестала нравиться дисковая загрузка, попросил ИТ-отдел удвоить память, результат был налицо.

На клиенте просто по отзывчивости работы клиента, срокам отклика интерфейса, благо сам работал в том числе как пользователь в том, что разрабатывал; когда просто помогал пользователям что-то делать, ну и многие пользователи были приучены сообщать о замедлении работы в той или иной сфере.

Ну еще мониторил иногда профайлером запросы с большим duration или cpu.

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

И да, речь, конечно, была о двухзвенке.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164313
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНасчет трафика непонятно. Например, если задача стоит возвращать количество и цену или количество, цену и сумму, то трафик больше при расчете на сервере.ну, грубо говоря, если стоит вариант передавать несколько аргументов функции, либо результат этой функции.

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

Повторюсь, речь о двухзвенке.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164318
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, а где ты увидел иронию?

Мне просто интересно, кто чем пользуется и как. МСУ помнится смог себе SCOM позволить :)
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164321
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAShocker.Pro, а где ты увидел иронию?а, тады сорри
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164681
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите великодушно, что прерываю Вашу милую беседу своими расспросами..

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT   Заказчик, стоимость часа
         Sum(case when [Вид работ]=N'погрузка' then Стоимость else 0 end) As Expr1, 
         Sum(case when [Вид работ]=N'обработка' then Стоимость else 0 end), 
         Sum(case when [Вид работ]=N'погрузка' then Тонны else 0 end), 
         Sum(case when [Вид работ]=N'обработка' then Тонны else 0 end),
         Sum(case when [Вид работ]=N'погрузка' then Тонны else 0 end)*стоимость часа AS Total
FROM     Table..


Что то мне подсказывает дополнительное дублирующее вычисление Sum(case when [Вид работ]=N'погрузка' then Тонны else 0 end) *стоимость часа AS Total излишне. Как то можно заменить на что то типа Expr1*стоимость часа AS Total? А то так то получается, что одно и тоже значение вычисляется дважды
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164705
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114Простите великодушно, что прерываю Вашу милую беседу своими расспросами..На момент твоего поста, беседа закончилась 15 часов назад.

mdm114
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT   Заказчик, стоимость часа
         Sum(case when [Вид работ]=N'погрузка' then Стоимость else 0 end) As Expr1, 
         Sum(case when [Вид работ]=N'обработка' then Стоимость else 0 end), 
         Sum(case when [Вид работ]=N'погрузка' then Тонны else 0 end), 
         Sum(case when [Вид работ]=N'обработка' then Тонны else 0 end),
         Sum(case when [Вид работ]=N'погрузка' then Тонны else 0 end)*стоимость часа AS Total
FROM     Table..


Что то мне подсказывает дополнительное дублирующее вычисление Sum(case when [Вид работ]=N'погрузка' then Тонны else 0 end) *стоимость часа AS Total излишне. Как то можно заменить на что то типа Expr1*стоимость часа AS Total? А то так то получается, что одно и тоже значение вычисляется дваждыИ что? План выполнения от этого сильно хуже, скорость проседает?

Ну используй эту часть:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT Заказчик, стоимость часа
       SUM(case when [Вид работ]=N'погрузка' then Стоимость else 0 end), 
       SUM(case when [Вид работ]=N'обработка' then Стоимость else 0 end), 
       SUM(case when [Вид работ]=N'погрузка' then Тонны else 0 end), 
       SUM(case when [Вид работ]=N'обработка' then Тонны else 0 end)
FROM   Table..

как подзапрос, или CTE, или представление, или данные для временной таблицы, или данные для денормализации... или вычисляй Total на клиенте
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164715
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT Заказчик, ПогрузкаСтоимость, ОбработкаСтоимость, ПогрузкаТонны, ОбработкаТонны, ОбработкаТонны*@СтоимостьЧаса AS Всего
FROM (

SELECT   Заказчик,
         Sum(case when [Вид работ]=N'погрузка' then Стоимость else 0 end) AS ПогрузкаСтоимость, 
         Sum(case when [Вид работ]=N'обработка' then Стоимость else 0 end) AS ОбработкаСтоимость, 
         Sum(case when [Вид работ]=N'погрузка' then Тонны else 0 end) AS ПогрузкаТонны, 
         Sum(case when [Вид работ]=N'обработка' then Тонны else 0 end) AS ОбработкаТонны
FROM     Table
WHERE    (MONTH(Дата) = 12) AND (YEAR(Дата) = 2015)
GROUP BY Заказчик

) AS T
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164731
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164760
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По хорошему просто
Код: sql
1.
2.
3.
4.
5.
SELECT   Заказчик, Вид работ, Cтоимость часа, sum(Стоимость) as Стоимость, sum(Тонны) as Тонны
FROM     Table
WHERE    (MONTH(Дата) = 12) AND (YEAR(Дата) = 2015)
GROUP BY Заказчик, Вид работ, Cтоимость часа
ORDER BY Заказчик


Остальное допилить на клиенте по получению.

Если на сервере допиливать, то через временную таблицу. Лучше сначала выбрать необходимое во временную таблицу, а потом выборка из нее.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
IF object_id('tempdb..#t') IS NOT NULL DROP TABLE #t

SELECT   Заказчик, Вид работ, Cтоимость часа, sum(Стоимость) as Стоимость, sum(Тонны) as Тонны
INTO #t
FROM     Table
WHERE    (MONTH(Дата) = 12) AND (YEAR(Дата) = 2015)
GROUP BY Заказчик, Вид работ, Cтоимость часа

GO

SELECT Заказчик, стоимость часа
       SUM(case when [Вид работ]=N'погрузка' then Стоимость else 0 end), 
       SUM(case when [Вид работ]=N'обработка' then Стоимость else 0 end), 
       SUM(case when [Вид работ]=N'погрузка' then Тонны else 0 end), 
       SUM(case when [Вид работ]=N'обработка' then Тонны else 0 end)
FROM  #t

DROP TABLE #t



Не стоит пытаться все утрамбовать в один запрос. MS SQL на сложных запросах иногда нездоровый план делает. Сталкивался со случаями когда запрос работающий 10-15 сек, после подобного разбиения выполнялся менее секунды.

И блокировки не надо держать больше чем надо. Выбрал, GO, и допиливай никому не мешая.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164765
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114
Код: sql
1.
SELECT   Заказчик, стоимость часа ...


Что то мне подсказывает дополнительное дублирующее вычисление Sum(case when [Вид работ]=N'погрузка' then Тонны else 0 end) *стоимость часа AS Total излишне. Как то можно заменить на что то типа Expr1*стоимость часа AS Total? А то так то получается, что одно и тоже значение вычисляется дважды
Мне что-то подсказывает что ты не то считаешь.
Такой результат ожидается?
Заказчикстоимость часаПогрузкаСтоимость...Заказчик1100500...Заказчик1200400...Заказчик2100700...

Или так надо?
ЗаказчикПогрузкаСтоимость...Заказчик1900...Заказчик2700...
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164769
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли на сервере допиливать, то через временную таблицу. Лучше сначала выбрать необходимое во временную таблицу, а потом выборка из нее.Для более сложных случаев совершенно согласен - оптимизатор начинает захлебываться, когда городишь сложные куски.

У меня случай был - поменяли сервер на более мощный, в частности проц - с одноядерного на восьмиядерный. Так один из часто используемых запросов выборки стал выполняться 10 сек вместо 1 сек на одноядерном сервере. Оптимизатор радостно увидел возможность распараллеливания запроса и... лоханулся.
Переход на временную таблицу решил проблему.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39165013
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, второй вариант. НО, я всеж буду разбивать на несколько таблиц следуя советам выше. Иначе такой огород получается..
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39165027
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProУ меня случай был - поменяли сервер на более мощный, в частности проц - с одноядерного на восьмиядерный. Так один из часто используемых запросов выборки стал выполняться 10 сек вместо 1 сек на одноядерном сервере. Оптимизатор радостно увидел возможность распараллеливания запроса и... лоханулся.
Переход на временную таблицу решил проблему. OPTION (MAXDOP number)

Configure the max degree of parallelism Server Configuration Option
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39165029
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли на сервере допиливать, то через временную таблицу. Лучше сначала выбрать необходимое во временную таблицу, а потом выборка из нее.Сомнительное удовольствие.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39165031
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114Dima T, второй вариант. НО, я всеж буду разбивать на несколько таблиц следуя советам выше. Иначе такой огород получается..
тогда умножать внутри sum()
Код: sql
1.
2.
3.
4.
5.
SELECT   Заказчик, Вид работ, sum(Стоимость) as Стоимость, sum(Тонны) as Тонны, sum(Тонны * Cтоимость часа)  as СтоимостьПогрузки
FROM     Table
WHERE    (MONTH(Дата) = 12) AND (YEAR(Дата) = 2015)
GROUP BY Заказчик, Вид работ
ORDER BY Заказчик
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166354
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, чуть попозже вернусь к этому запросу. Переделка одного влечет за собой попутно и переделку еще нескольких вещей.
Сейчас закипел над таблицей с аналогичным вопросом: Реально ли все совместить в одном запросе?
№ Погрузка - Наладка - Обработка - Прочее1.----0----------200---------0-----------4002.----0-----------0---------400-----------03.----0----------400---------0-----------6004.---300----------0---------800-----------0


Нужно среднее значение по каждому виду работ.

---300---300---600--500
SELECT AVG(Погрузка) AS e1, AVG(Наладка) AS e2..
FROM Table..
В данном случае правильным подсчетам мешают нули? Ставить что то типа WHERE погрузка !=0 не вариант. Тогда не учитываются 2ая и 4ая строка в Наладке. Есть конечно вариант, разбить на четыре таблицы. А вот в одном запросе реально совместить?
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166369
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
AVG(NULLIF(Погрузка,0))



А вообще, по-хорошему, именно NULL-ы, а не нули должны быть в базе, там где нет значения
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166415
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, при NULL иногда приходится в коде через try что то делать. А это в свою очередь в определенных моментах такие тормоза добавляет
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166429
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114иногда приходится в коде через try что то делатьЭто странно. Что например?
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166519
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

№ . -н1-- н2--н3--н41. ---1----2----3---42. ---1----2----3---43 - --1---NULL-2---3
decimal dc= table.tbl[0].н1
decimal dc= table.tbl[1].н1
decimal dc= table.tbl[2].н1 ???
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166550
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не очень понял, где тут повод для try
Можно использовать проверку на null, можно использовать оператор ??, можно использовать тип decimal? вместо decimal...
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166769
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а можно меня носом ткнуть в какой нить пример
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166799
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример чего? Я не понял первичной задачи.
В любом случае, try используется в первую очередь для перехвата исключений, генерируемых, как правило, ситуациями, когда что-то пошло не так. А если в программе изначально закладывается возможность, когда некое поле может принимать значение null, то это нормальная, не исключительная ситуация и try здесь никак не должен ее обрабатывать.

По заполнение БД я говорю из опыта. Когда по логической сути задачи в БД отсутствие значение, то нужно заносит Null, а не какое-то искусственный заменитель типа 0 или -1 или других так называемых "волшебных" числе или строк. Тогда и вопрос с AVG не возник бы сам собой.

В большинстве случаев такой подход оправдан, однако, возможно, в вашем конкретном случае оправдано использование нуля по каким-то специфическим причинам. Именно поэтому я просил привести пример.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39166801
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ: почему вы так странно оформляете таблицы? ))))
123456789101112
...
Рейтинг: 0 / 0
25 сообщений из 74, страница 2 из 3
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите с запросом с двумя select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]