powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите с запросом с двумя select
74 сообщений из 74, показаны все 3 страниц
Помогите с запросом с двумя select
    #39158203
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть
Код: c#
1.
2.
3.
SELECT  SUM(summe) AS Expr1,
               (SELECT   SUM(summe) AS Expr2  FROM table  WHERE (MONTH(Datum) = '12') ) AS Axpr2                          
FROM  table WHERE        (MONTH(Datum) = '12')



Хочу добавить еще SUM(sumTn) AS Expr3, SUM(sumTn) AS Expr4, но не пойму куда
c Expr3 все легко, а куда надо подставить SUM(sumTn) AS Expr4 ? Чет совсем запутался..
Вроде бы напрашивается,
Код: c#
1.
2.
3.
SELECT  SUM(summe) AS Expr1,SUM(sumTn) AS Expr3, 
(SELECT   SUM(summe) AS Expr2,SUM(sumTn) AS Expr4   FROM table  WHERE (MONTH(Datum) = '12')) AS Expr2                          
FROM  table WHERE        (MONTH(Datum) = '12')


В выводе Expr4 нет. Неужели только отдельную строку добавлять?
Код: c#
1.
2.
3.
4.
SELECT  SUM(summe) AS Expr1,SUM(sumTn) AS Expr3, 
(SELECT   SUM(summe) AS Expr2  FROM table  WHERE (MONTH(Datum) = '12')) AS Expr2, 
(SELECT   SUM(sumTn) AS Expr4   FROM table  WHERE (MONTH(Datum) = '12')) AS Expr4                         
FROM  table WHERE        (MONTH(Datum) = '12')
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39158223
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это вопрос чисто по SQL, его логично было задавать в подфоруме соответствующей СУБД. Тем более, что СУБД не указана, а синтаксис может отличаться.
Для начала в самом первом запросе какая-то ерунда, поэтому непонятно вообще, что требуется получить. Зачем отбирается два раза SUM(summe) по одинаковым условиям?
Подзапрос в качестве поля выборки - это вообще хрень какая-то.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39158906
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПодзапрос в качестве поля выборки - это вообще хрень какая-то.

нормально это
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39158923
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хрень какая. Не пиши такую жесть даже если она срабатывает.
Приведи тестовый набор данных и какой результат хочешь получить.

PS По-хорошему надо спрашивать в форуме по СУБД, в которую запрос пошлешь.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159115
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, что вчера не ответил. Метель, обрыв ЛЭПа, А лкоголь и женщины. В общем сумма всех вышеуказанных факторов помешала вернуться к компу в теч. дня для решения вопроса по другому суммированию. Также извиняюсь, если не в тот форум спросил. Ежели чего, то прошу модераторов перенести в соответствующий. Раньше вроде похожие вопросы здесь задавал. Вроде даже отвечали..
База - SQL-Server
Суть -есть таблица
id - менеджер - Стоимость - Тонны - Вид работ ------ Дата - Заказчик1 ----- Петр ------- 200 -------- 20 -----погрузка --- 20/12/2015 - SOK2 ----- Сергей ---- 300 -------- 30 -----обработка ---20/12/2015 - SOK3 ----- Петр ------- 200 -------- 20 -----погрузка --- 20/12/2015 -- DTS4 ---- - Сергей --- 300 -------- 30 -----обработка --- 20/12/2015 - DTS5 ----- Петр ------- 200 -------- 20 -----погрузка ----20/12/2015 -- GVR6 ----- Сергей ---- 300 -------- 30 -----обработка ---20/12/2015 -- GVR
....
нужна выборка сумм Стоимости и Тонн в течение месяца по разным заказчикам с разделением по видам работ.
т.е с условием WHERE (MONTH(Дата) = '{0}') AND (YEAR(Дата) = '{1}') AND (вид работ= '{2}' AND (заказчик= '{3}')
id - Expr1 - Expr2 - Expr3 - Expr41 --- 4000 - 800 ---- 7000 --- 500 //SOK

где Expr1 = Сумма стоимостей вида работ "погрузка" в текущем месяце
Expr2 = Сумма стоимостей вида работ "обработка" в текущем месяце
Expr3 = Сумма тоннажа вида работ "погрузка" в текущем месяце
Expr4 = Сумма тоннажа вида работ "обработка" в текущем месяце

далее через цикл остальные заказчики
2 - 6000 - 400 - 3000 - 300 //DTS3 - 6000 - 400 - 3000 - 300 //GVR
Виды работ фиксированные и не меняются. Кол-во заказчиков в разные месяца - разное
Вывод таблицы с Expr1 и Expr2 вроде добился. А вот добавить в нее сумму тоннажей не получается. Может изначально запрос неправильно составил
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159125
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
WHERE    (MONTH(Дата) = 12) AND (YEAR(Дата) = 2015)
GROUP BY Заказчик, [Вид работ]
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159126
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, группировка по Вид работ лишняя
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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
WHERE    (MONTH(Дата) = 12) AND (YEAR(Дата) = 2015)
GROUP BY Заказчик
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159128
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заменить
Shocker.Pro
Код: sql
1.
WHERE    (MONTH(Дата) = 12) AND (YEAR(Дата) = 2015)

на
Код: sql
1.
WHERE Дата between @From and @To
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159130
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

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

Да, верно, я еще не совсем проснулся )))С Добрым утром!

:-)
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159132
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КShocker.ProДа, верно, я еще не совсем проснулся )))С Добрым утром!Построитель SQL-запросов проснулся, а оптимизатор еще спит
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159153
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем. Все работает. Синтаксис для меня странный. Надо будет разбираться еще что к чему. Остался один вопрос - где указать наименования столбцов?
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159156
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
         Sum(case when [Вид работ]=N'погрузка' then Стоимость else 0 end) AS Expr1, 

но хорошим тоном все-таки считается давать вменяемые имена всему (переменным, формам, полям и т.п.). Потом сам запутаешься.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159157
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да я уж разобрался, чет тормознул сразу. А имена другие. Я тут так для простоты изложения написал, чтобы моск никому не выносить непонятными буквами
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159160
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114Синтаксис для меня странный.Для меня меня странным оказался как раз синтаксис, изложенный в первом сообщении )
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159390
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нагуглил где-то..

Запустил в полную мощь - результат превзошел все мои ожидания. Еще раз респект.
Остался вопрос зачем N в [Вид работ]=N'погрузка' ? Не смог найти ответ
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159394
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какого типа у вас поле "Вид работ"?

ЗЫ: по хорошему-то оно должно быть вообще внешним ключом, впрочем как и Заказчик и Менеджер
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159397
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114нагуглил где-то..

Запустил в полную мощь - результат превзошел все мои ожидания. Еще раз респект.
Остался вопрос зачем N в [Вид работ]=N'погрузка' ? Не смог найти ответ
Это значит строка в юникоде.
https://msdn.microsoft.com/ru-ru/library/ms186939(v=sql.120).aspx Prefix Unicode character string constants with the letter N. Without the N prefix, the string is converted to the default code page of the database. This default code page may not recognize certain characters.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159398
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
как раз сейчас задумался над тем, чтобы вынести в отдельную таблицу. Так - varchar

Dima T, за ссыль спасибо. Ситуация потихонечку проясняется
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39159402
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если varchar, то N можно убрать
если бы было nvarchar - N помогло бы избежать излишнего неявного преобразования строки в юникод
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164238
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После Ваших советов пришлось переделывать много чего. Выкинул много кода. Еще раз благодарствую. Будете у нас в Нижнем -пиво с меня.
В продолжение данной темы возник вопрос. Как по фенсую делается произведение двух колонок? В клиентском коде или это можно как то в запрос запихнуть? И стоит ли это того?

У меня labels привязаны к табличке. Соответственно вслед за изменением позиции bindingsource меняются и значения. Сейчас у меня прицеплена функция к bindingsource.PositionChanged. Но гложет вопрос, может еще как то по другому можно сделать? Т.е отобразить сразу произведение в таблице и прицепить к этой колонке свой label минуя функцию?
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164260
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при наличии SQL-сервера я стараюсь делать подобные вещи на стороне сервера - уменьшается трафик, уменьшается нагрузка на клиента, а сервер - он и нужен для того, чтобы пахать )
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164273
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХУ то что можно делать на клиенте - лучше делать на клиенте, т.к. сервер один. Пока он молотит для одного клиента - возможно другой тупо ждет.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164276
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХУ то что можно делать на клиенте - лучше делать на клиенте, т.к. сервер один. Пока он молотит для одного клиента - возможно другой тупо ждет.Что проще, нарастить мощность одного сервера или нарастить мощность сотни клиентов?

Dima TПока он молотит для одного клиента - возможно другой тупо ждет.Либо ты плохо организовал его работу, либо сервер слаб для своих задач.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39164288
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProDima TИМХУ то что можно делать на клиенте - лучше делать на клиенте, т.к. сервер один. Пока он молотит для одного клиента - возможно другой тупо ждет.Что проще, нарастить мощность одного сервера или нарастить мощность сотни клиентов?
А как вы построили клиентский мониторинг, ну и серверный, чтобы узнать, когда и где пора что-то наращивать?
...
Рейтинг: 0 / 0
Помогите с запросом с двумя 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
Помогите с запросом с двумя select
    #39166832
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в таблицу заносится результат вычислений. Берется фиксированная цена из таблицы № 1. И в таблицу номер два заносится уже произведение цены на количество. Соответсвенно, если кол-во ноль, то и в таблицу заносится ноль. Плюс там различные скидки и проч, соответсвенно все цены расходятся с базовой. Хочу увидеть усредненную
По поводу таблички - Чет про запятые не дочитал. Первые разы с планшета писал - довольно ущербная штуковина. Видимо как то криво всплывающая подсказка вылезла
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39167651
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro...
Можно использовать проверку на null, можно использовать оператор ??, можно использовать тип decimal? вместо decimal...
Мне безумно стыдно, но чет не доводилось до сих пор сталкиваться.
Как ими пользоваться то?
decimal? dc1;
dc1 =db.table[0].expr;
Ошибку выдает. Или надо GetValueOrDefault использовать?
С двойным ? вообще не пойму
decimal? dc1 = null;
deciamal dc2 = dc1 ?? db.table[0].expr;
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39167678
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114decimal? dc1;
dc1 =db.table[0].expr;
Ошибку выдает.текст ошибки надо угадать?
mdm114С двойным ? вообще не пойму
decimal? dc1 = null;
deciamal dc2 = dc1 ?? db.table[0].expr;непонятно, что не понятно. ?? позволяет заменить null на корректное значение, к примеру
Код: c#
1.
2.
decimal? dc1 = null;
decimal dc2 = (decimal)(dc1 ?? 0M);
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39167846
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Promdm114decimal? dc1;
dc1 =db.table[0].expr;
Ошибку выдает.текст ошибки надо угадать?

Дык ругается, что значение для столбца expr равно DBNULL
Shocker.Promdm114С двойным ? вообще не пойму
decimal? dc1 = null;
deciamal dc2 = dc1 ?? db.table[0].expr;непонятно, что не понятно. ?? позволяет заменить null на корректное значение, к примеру
Код: c#
1.
2.
decimal? dc1 = null;
decimal dc2 = (decimal)(dc1 ?? 0M);


Я понял что меняет. Я думал что возможна сразу конструкция, которая вытягивает значение из db.table[0].expr и, в случае если оно DBNULL меняет на 0
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39168110
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114Дык ругается, что значение для столбца expr равно DBNULLну так dbnull и null не совсем одно и то же )
mdm114вытягивает значение из db.table[0].expr и, в случае если оно DBNULL меняет на 0ну так для этого есть тернарный оператор, либо можно сделать свой метод расширения для удобства
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39168349
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, еще почитаю по этому поводу дополнительно и буду пробовать
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39170158
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде бы на ровном месте произошла еще одна странность
Есть три таблицы
1. Описание товара - tbl1
2. Складские остатки - tbl_sklad
3. Продажи - tbl_sale

Нужны суммы продаж и складских остатков

1.Складские остатки
Код: sql
1.
2.
3.
4.
5.
SELECT tbl1.Id
,SUM(tbl_sklad.длина) AS На складе
FROM tbl1
LEFT JOIN tbl_sklad ON tbl1.id =tbl_sklad.pId
GROUP BY tbl1.Id


выводит
№уч карточки На складе482 214.16483 344.56493 208.76
тут суммы правильные

2. Сумма продаж
Код: sql
1.
2.
3.
4.
5.
SELECT tbl1.Id
,SUM(tbl_sale.длина) AS Продано
FROM tbl1
LEFT JOIN tbl_sale ON tbl1.id =tbl_sale.pId
GROUP BY tbl1.Id


№ уч карточки Продажи482 NULL483 30493 18.10
тут тоже все суммы сходятся

Далее пытаюсь

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT tbl1.Id
,SUM(tbl_sklad.длина) AS На складе
,SUM(tbl_sale.длина)  AS Продано
FROM tbl1
LEFT JOIN tbl_sklad ON tbl1.id =tbl_sklad.pId
LEFT JOIN tbl_sale  ON tbl1.id =tbl_sale.pId
GROUP BY tbl1.Id



выводится какая то хрень. Че тут насуммировалось, непонятно..

№уч карточки На складе Продано482 214.16 NULL483 689.12 960.00493 417.52 380.10
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39170246
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdm114выводится какая то хреньЧтобы понять, почему хрень, посмотри результаты запроса без группировки:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT tbl1.Id
,tbl_sklad.длина AS На складе
,tbl_sale.длина  AS Продано
FROM tbl1
LEFT JOIN tbl_sklad ON tbl1.id =tbl_sklad.pId
LEFT JOIN tbl_sale  ON tbl1.id =tbl_sale.pId

и сразу станет понятно
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39170280
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сообщение 8120, уровень 16, состояние 1, строка 1
Column 'tbl1.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39170285
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так не надо использовать агрегирующие функции, просто посмотри результат запроса без группировки
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39170410
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я мож не допонял что-то, но первые два запроса с агрегирующими функциями и без них выдают один и тот же результат. Причем он правильный. Там в продажах у 493-й учетной карточки числятся два значения 9.20 и 8.90. Я уж и ограничения делал WHERE id= 493. Результат одинаковый
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39170439
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз. Забей на первый два запроса, они правильные и работают как надо.
Ты не не понял, почему в третьем случае (когда ты присоединяешь сразу две таблицы), ты получаешь не те итоговые данные, которые ты ожидаешь.

Чтобы понять - почему так, я предлагаю тебе выполнить не суммирующий не группирующий запрос (который я привел). Ты сразу увидишь и поймешь, в чем твоя ошибка. Думаю, что все, кто начинал работать с SQL через этот момент проходили.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39170998
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так а что он должен вывести? В первой таблице 10 записей. Во второй две. Выводится хрень полная. Я так понимаю, что придется на два отдельных запроса разбить
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39171289
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выводится не хрень полная, а перемножение двух присоединенных таблиц, то есть все возможные их сочетания. Таким образом, данные для суммирования задваиваются, затраиваются и т.п., соответственно, получается неверная сумма.

Решение может быть таким:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT tbl1.Id
,SKL.Sm AS 'На складе'
,SAL.Sm AS Продано
FROM tbl1
LEFT JOIN (SELECT pId, SUM(длина) AS Sm FROM tbl_sklad GROUP BY pID) SKL ON tbl1.Id=SKL.pId
LEFT JOIN (SELECT pId, SUM(длина) As Sm FROM tbl_sale GROUP BY pID) SAL ON tbl1.Id=SAL.pId

но, как говорилось выше, не всегда стоит увлекаться слишком навороченными подзапросами
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39171532
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
даа, чет мне такая подвыборка в голову не пришла. Спасибо
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39181921
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
можно еще один вопрос?

есть
Код: sql
1.
2.
3.
4.
5.
6.
SELECT posId, [st] ,dateOut
,SUM(dl) AS Sumdl
,SUM.... AS tnMetr 
,SUM.... AS tnTotal 
FROM tbl1...
GROUP BY ....st,posId,  dateOut



вывод:
№ st dateOutSumdltnMetrtnTotal54 8.00 2015-12-01 10:29:58.303 1.00 77.3337 77.333754 8.00 2015-12-01 10:29:59.067 1.00 77.3337 77.333754 8.00 2015-12-01 10:29:59.817 1.00 77.3337 77.333754 8.00 2015-12-01 10:30:00.627 1.00 77.3337 77.333754 8.00 2015-12-01 10:30:01.563 1.00 77.3337 77.333754 8.00 2015-12-01 10:30:02.320 1.00 77.3337 77.3337

Группировка по дате отсутствует, так как(насколько я правильно понял) разное время. Это как то можно обойти в запросе? Чтобы как то игнорировалось время, а dateOut воспринималась как ShortDate штоле..
т.е. нужно
№ st dateOutSumdltnMetrtnTotal54 8.00 2015-12-01 6 77.3337 77.3337*6
Или опять же проблема в изначально неправильном подходе к занесению даты в таблицу?
При занесении значение берется из DateTimePicker.Value...
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39182072
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, конечно, группировать и выводить округленную дату, но это плохое решение, так как сортировка/группировка/отбор по выражению исключает использование индексов. Лучше, если время не требуется в базе, не писать его туда.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39182074
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
SELECT posId, [st] ,cast(dateOut as date) as dateOut
...
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39182453
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за советы
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39183237
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
стал пробовать ругается.

Type date is not a defined system type.

В нете смотрел синтаксис. Вроде такой же как в Вашем примере.
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39183266
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка MS SQL или .Net ? версия MS SQL какая?
У меня работает из MSSQL 2012 Management Studio
Код: sql
1.
2.
3.
4.
select nPostId, cast(tDate as date) as tDate, sum(nSum) as nSum
	from MyTable
	where year(tDate) = 2016
	group by nPostId, tDate


Если старый MSSQL (тип date в 2008 вроде появился), то надо использовать datediff() или dateadd() (точно не помню). Тогда тип останется datetime
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39183287
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот по-старому
Код: sql
1.
select nPostId, DATEADD(day, DATEDIFF(day, 0, tDate), 0) as tDate, sum(nSum) as nSum


Взято тут 15115537
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39183745
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
Пробовал в Managment Studio. 2008. Попробую попозже в проекте. Не думал, что разница есть..
Спасибо, отпишусь
...
Рейтинг: 0 / 0
Помогите с запросом с двумя select
    #39185549
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, проблема именно в этом. База была на 2000, перенес на 2012, все заработало без проблем
...
Рейтинг: 0 / 0
74 сообщений из 74, показаны все 3 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите с запросом с двумя select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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