Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Помогите с запросом с двумя select  [new]
mdm114
Member

Откуда:
Сообщений: 120
Есть
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 ? Чет совсем запутался..
Вроде бы напрашивается,
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 нет. Неужели только отдельную строку добавлять?
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')
29 янв 16, 09:30    [18743933]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
Если это вопрос чисто по SQL, его логично было задавать в подфоруме соответствующей СУБД. Тем более, что СУБД не указана, а синтаксис может отличаться.
Для начала в самом первом запросе какая-то ерунда, поэтому непонятно вообще, что требуется получить. Зачем отбирается два раза SUM(summe) по одинаковым условиям?
Подзапрос в качестве поля выборки - это вообще хрень какая-то.
29 янв 16, 09:48    [18744027]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Иммануил Кант
Member [заблокирован]

Откуда:
Сообщений: 3490
Shocker.Pro
Подзапрос в качестве поля выборки - это вообще хрень какая-то.


нормально это
29 янв 16, 18:57    [18747603]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Dima T
Member

Откуда:
Сообщений: 15281
Хрень какая. Не пиши такую жесть даже если она срабатывает.
Приведи тестовый набор данных и какой результат хочешь получить.

PS По-хорошему надо спрашивать в форуме по СУБД, в которую запрос пошлешь.
29 янв 16, 19:17    [18747677]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
mdm114
Member

Откуда:
Сообщений: 120
Извиняюсь, что вчера не ответил. Метель, обрыв ЛЭПа, Алкоголь и женщины. В общем сумма всех вышеуказанных факторов помешала вернуться к компу в теч. дня для решения вопроса по другому суммированию. Также извиняюсь, если не в тот форум спросил. Ежели чего, то прошу модераторов перенести в соответствующий. Раньше вроде похожие вопросы здесь задавал. Вроде даже отвечали..
База - SQL-Server
Суть -есть таблица
id - менеджер - Стоимость - Тонны - Вид работ ------ Дата - Заказчик
1 ----- Петр ------- 200 -------- 20 -----погрузка --- 20/12/2015 - SOK
2 ----- Сергей ---- 300 -------- 30 -----обработка ---20/12/2015 - SOK
3 ----- Петр ------- 200 -------- 20 -----погрузка --- 20/12/2015 -- DTS
4 ---- - Сергей --- 300 -------- 30 -----обработка --- 20/12/2015 - DTS
5 ----- Петр ------- 200 -------- 20 -----погрузка ----20/12/2015 -- GVR
6 ----- Сергей ---- 300 -------- 30 -----обработка ---20/12/2015 -- GVR

....
нужна выборка сумм Стоимости и Тонн в течение месяца по разным заказчикам с разделением по видам работ.
т.е с условием WHERE (MONTH(Дата) = '{0}') AND (YEAR(Дата) = '{1}') AND (вид работ= '{2}' AND (заказчик= '{3}')
id - Expr1 - Expr2 - Expr3 - Expr4
1 --- 4000 - 800 ---- 7000 --- 500 //SOK


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

далее через цикл остальные заказчики
2 - 6000 - 400 - 3000 - 300 //DTS
3 - 6000 - 400 - 3000 - 300 //GVR

Виды работ фиксированные и не меняются. Кол-во заказчиков в разные месяца - разное
Вывод таблицы с Expr1 и Expr2 вроде добился. А вот добавить в нее сумму тоннажей не получается. Может изначально запрос неправильно составил
30 янв 16, 10:17    [18749316]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
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 Заказчик, [Вид работ]
30 янв 16, 10:48    [18749348]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
Сорри, группировка по Вид работ лишняя
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 Заказчик
30 янв 16, 10:50    [18749351]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Заменить
Shocker.Pro
WHERE    (MONTH(Дата) = 12) AND (YEAR(Дата) = 2015)
на
WHERE Дата between @From and @To
30 янв 16, 10:58    [18749361]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
Алексей К,

Да, верно, я еще не совсем проснулся )))
30 янв 16, 11:01    [18749370]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Shocker.Pro
Алексей К,

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

:-)
30 янв 16, 11:03    [18749372]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
Алексей К
Shocker.Pro
Да, верно, я еще не совсем проснулся )))
С Добрым утром!
Построитель SQL-запросов проснулся, а оптимизатор еще спит
30 янв 16, 11:04    [18749376]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
mdm114
Member

Откуда:
Сообщений: 120
Спасибо всем. Все работает. Синтаксис для меня странный. Надо будет разбираться еще что к чему. Остался один вопрос - где указать наименования столбцов?
30 янв 16, 13:12    [18749540]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
         Sum(case when [Вид работ]=N'погрузка' then Стоимость else 0 end) AS Expr1, 
но хорошим тоном все-таки считается давать вменяемые имена всему (переменным, формам, полям и т.п.). Потом сам запутаешься.
30 янв 16, 13:20    [18749557]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
mdm114
Member

Откуда:
Сообщений: 120
да я уж разобрался, чет тормознул сразу. А имена другие. Я тут так для простоты изложения написал, чтобы моск никому не выносить непонятными буквами
30 янв 16, 13:25    [18749563]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
mdm114
Синтаксис для меня странный.
Для меня меня странным оказался как раз синтаксис, изложенный в первом сообщении )
30 янв 16, 13:40    [18749582]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
mdm114
Member

Откуда:
Сообщений: 120
нагуглил где-то..

Запустил в полную мощь - результат превзошел все мои ожидания. Еще раз респект.
Остался вопрос зачем N в [Вид работ]=N'погрузка' ? Не смог найти ответ
31 янв 16, 10:22    [18751945]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
Какого типа у вас поле "Вид работ"?

ЗЫ: по хорошему-то оно должно быть вообще внешним ключом, впрочем как и Заказчик и Менеджер
31 янв 16, 10:48    [18751978]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Dima T
Member

Откуда:
Сообщений: 15281
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.
31 янв 16, 10:59    [18751991]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
mdm114
Member

Откуда:
Сообщений: 120
Shocker.Pro,
как раз сейчас задумался над тем, чтобы вынести в отдельную таблицу. Так - varchar

Dima T, за ссыль спасибо. Ситуация потихонечку проясняется
31 янв 16, 11:12    [18751999]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
если varchar, то N можно убрать
если бы было nvarchar - N помогло бы избежать излишнего неявного преобразования строки в юникод
31 янв 16, 11:18    [18752015]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
mdm114
Member

Откуда:
Сообщений: 120
После Ваших советов пришлось переделывать много чего. Выкинул много кода. Еще раз благодарствую. Будете у нас в Нижнем -пиво с меня.
В продолжение данной темы возник вопрос. Как по фенсую делается произведение двух колонок? В клиентском коде или это можно как то в запрос запихнуть? И стоит ли это того?

У меня labels привязаны к табличке. Соответственно вслед за изменением позиции bindingsource меняются и значения. Сейчас у меня прицеплена функция к bindingsource.PositionChanged. Но гложет вопрос, может еще как то по другому можно сделать? Т.е отобразить сразу произведение в таблице и прицепить к этой колонке свой label минуя функцию?
5 фев 16, 16:51    [18778739]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
при наличии SQL-сервера я стараюсь делать подобные вещи на стороне сервера - уменьшается трафик, уменьшается нагрузка на клиента, а сервер - он и нужен для того, чтобы пахать )
5 фев 16, 17:06    [18778804]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Dima T
Member

Откуда:
Сообщений: 15281
ИМХУ то что можно делать на клиенте - лучше делать на клиенте, т.к. сервер один. Пока он молотит для одного клиента - возможно другой тупо ждет.
5 фев 16, 17:11    [18778827]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21980
Dima T
ИМХУ то что можно делать на клиенте - лучше делать на клиенте, т.к. сервер один. Пока он молотит для одного клиента - возможно другой тупо ждет.
Что проще, нарастить мощность одного сервера или нарастить мощность сотни клиентов?

Dima T
Пока он молотит для одного клиента - возможно другой тупо ждет.
Либо ты плохо организовал его работу, либо сервер слаб для своих задач.
5 фев 16, 17:13    [18778834]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом с двумя select  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28149
Shocker.Pro
Dima T
ИМХУ то что можно делать на клиенте - лучше делать на клиенте, т.к. сервер один. Пока он молотит для одного клиента - возможно другой тупо ждет.
Что проще, нарастить мощность одного сервера или нарастить мощность сотни клиентов?

А как вы построили клиентский мониторинг, ну и серверный, чтобы узнать, когда и где пора что-то наращивать?
5 фев 16, 17:21    [18778859]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить