Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
Здравствуйте, у меня есть такой запрос в MS SQL, с помощью которого я узнаю остаток продуктов

SELECT fITEMID, SUM(fQTY) AS fREV
FROM SALES
WHERE SALES.fDATE <= '2017-07-01'
GROUP BY fITEMID

Теперь мне нужен объединить остатки нескольких дней, например хочу объединить остатки с 2017-07-01 до 2017-07-03, тогда нужно сделать три UNION а, как то так

SELECT fITEMID, SUM(fQTY) AS fREV
FROM SALES
WHERE SALES.fDATE <= '2017-07-01'
GROUP BY fITEMID
UNION
SELECT fITEMID, SUM(fQTY) AS fREV
FROM SALES
WHERE SALES.fDATE <= '2017-07-02'
GROUP BY fITEMID
UNION
SELECT fITEMID, SUM(fQTY) AS fREV
FROM SALES
WHERE SALES.fDATE <= '2017-07-03'
GROUP BY fITEMID

Как то возможно сделать это с помощью цикла ? я пока не успел изучить циклы, помогите если кто может
30 июл 17, 11:41    [20685594]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
xenix
Guest
А зачем здесь цикл?
SELECT S.fITEMID, SUM(S.fQTY) AS fREV,S.fDATE
FROM SALES S
WHERE S.fDATE BETWEEN '2017-07-01' AND '2017-07-03'
GROUP BY S.fITEMID,S.fDATE
30 июл 17, 11:46    [20685600]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
xenix
А зачем здесь цикл?
SELECT S.fITEMID, SUM(S.fQTY) AS fREV,S.fDATE
FROM SALES S
WHERE S.fDATE BETWEEN '2017-07-01' AND '2017-07-03'
GROUP BY S.fITEMID,S.fDATE

Так не получить остаток, а только оборот 
30 июл 17, 12:09    [20685627]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
Progress,

Вот таблица, если нужно считать остаток, то просто суммирую до нужной даты

К сообщению приложен файл. Размер - 69Kb
30 июл 17, 12:14    [20685632]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
Progress,

Мне просто нужно считать средний остаток ну например с 2017-07-01 до 2017-07-31
30 июл 17, 12:54    [20685672]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
xenix
Guest
Вот кусок твоего скриншота в более удобном виде:
USE MASTER 
GO

WITH CTE(FDATE,FMTID,FQTY)AS
(
  SELECT '2017-06-08',100835,8.00
   UNION ALL
  SELECT '2017-06-08',100742,10
   UNION ALL
  SELECT '2017-06-08',100920,10
   UNION ALL
  SELECT '2017-06-09',100765,-10
   UNION ALL
  SELECT '2017-06-10',100661,-1
   UNION ALL
  SELECT '2017-06-10',100679,-1
   UNION ALL
  SELECT '2017-06-10',101212,-1      
   UNION ALL
  SELECT '2017-06-11',101212,-3 
   UNION ALL
  SELECT '2017-06-12',101026,-1
   UNION ALL
  SELECT '2017-06-12',100676,-2  
   
)
SELECT C.* FROM CTE C;

Что ты хочешь получить на выходе?
30 июл 17, 13:14    [20685686]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
xenix,

ну например хочу получить остаток товара за три дня, за 2017-07-01, за 2017-07-02 и за 2017-07-03

К сообщению приложен файл. Размер - 85Kb
30 июл 17, 13:30    [20685702]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
Progress,

мне нужен получить сумму, те в том случае 26 * 3 = 78
30 июл 17, 13:31    [20685707]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
Progress,

Но представь если так захочется за 2017-07-01 до 2017-07-31
30 июл 17, 13:32    [20685709]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
iii2
Member

Откуда:
Сообщений: 202
Оконные функции пробовал?
30 июл 17, 16:23    [20685863]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
iii2,

Нет, я только начинаю изучать SQL
Попробовал как то так по циклу, но теперь нужно чтобы эти три запроса обьеднились по UNION ALL
30 июл 17, 16:28    [20685874]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
Progress,

К сообщению приложен файл. Размер - 76Kb
30 июл 17, 16:29    [20685876]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
iii2
Member

Откуда:
Сообщений: 202
Для этой задачи не нужен цикл.
:-)
30 июл 17, 16:41    [20685896]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
iii2,

Буду признателен за ваш помощь, как решить задачу ?
30 июл 17, 16:43    [20685900]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
iii2
Member

Откуда:
Сообщений: 202
Progress, Во внутреннем запросе просуммируй значения с группировкой по дням, fITEMID, до максимальной из твоих искомых дат (в примере до 2017-07-03).
Во внешнем запросе - рассчитай остатки: Select ..., sum(Сумма по дню из внутреннего подзапроса) оver (partition by fITEMID order by fDATE ROWS UNBOUNDED PRECEDING)
Ну и наконец, в самом внешнем запросе - выбери из предыдущего набора только нужные тебе даты.
30 июл 17, 17:04    [20685926]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
iii2,

SELECT fDATE, fMTCODE, SUM(fREV)
FROM (SELECT MH.fDATE, MT.fMTCODE, SUM(MH.fQTY) AS fREV
FROM MTHI MH, MATERIALS MT
WHERE MH.fDATE < '2017-07-01' AND MH.fMTID = MT.fMTID AND fMTCODE = '1000002'
GROUP BY MH.fDATE, MT.fMTCODE) AS T1
OVER (partition by fITEMID order by fDATE ROWS UNBOUNDED PRECEDING)

Что не так ?
30 июл 17, 17:12    [20685936]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
iii2
Member

Откуда:
Сообщений: 202
Нет.
Так и приётся включить компьютер :-)
30 июл 17, 17:14    [20685942]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
iii2,

Если не трудно можете подсказать ? )
30 июл 17, 17:30    [20685966]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
iii2
Member

Откуда:
Сообщений: 202
if OBJECT_ID('tempdb..#t') is not null 
	Drop table #t;

Select * 
into #t
from
(Values 
   (Cast('20170608' as date), 100835,8.00)
,  ( '20170608',100742,10)
,  ( '20170608',100920,10)
,  ( '20170609',100765,-10)
,  ( '20170610',100661,-1)
,  ( '20170610',100679,-1)
,  ( '20170610',101212,-1)     
,  ( '20170611',101212,-3) 
,  ( '20170612',101026,-1)
,  ( '20170612',100676,-2)) t(FDATE,FMTID,FQTY)
 
Select * from (
Select  fDATE, FMTID, Sum(fREV) over (partition by fDATE, FMTID order by fDATE ) Itog
from (
SELECT MH.fDATE, MH.FMTID, SUM(MH.fQTY) AS fREV
FROM #t MH
WHERE MH.fDATE <= '20170612'
Group by MH.fDATE, MH.FMTID) t
) t2
Where fDATE in ('20170612', '20170610', '20170608')
Order by fDATE Asc
30 июл 17, 17:36    [20685971]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
iii2
Member

Откуда:
Сообщений: 202
Примерно так.

И таблице в запросе соединяйте не в стиле SQL89,
Select ... from table1, table2
Where table1.a =* table2.a

Скоро так писать запретят, если уже не запретили.
Используйте join.
30 июл 17, 17:41    [20685980]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
iii2,

iii2,

изучаю over, но здесь видает такую ошибку

SELECT fDATE, fQTY, SUM(fQTY) OVER (ORDER BY fDATE) AS Balance
FROM MTHI
ORDER BY fDATE

incorrect synta near order
30 июл 17, 18:54    [20686086]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Progress
iii2,

iii2,

изучаю over, но здесь видает такую ошибку

SELECT fDATE, fQTY, SUM(fQTY) OVER (ORDER BY fDATE) AS Balance
FROM MTHI
ORDER BY fDATE

incorrect synta near order
Надо было сообщить свою версию SQL Server. Должно быть >=SQL2012
30 июл 17, 19:50    [20686196]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
iap,

наверника, да 2012
по другому нужно писать ?
30 июл 17, 19:53    [20686200]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
Progress
Member

Откуда:
Сообщений: 25
оказалась sever 2005
30 июл 17, 20:50    [20686268]     Ответить | Цитировать Сообщить модератору
 Re: Union с помощью цикла  [new]
iii2
Member

Откуда:
Сообщений: 202
Progress, тогда так не пойдет.
Для вычисления суммы с накоплением придется использовать запрос с самосоединением.

Если до завтра коллеги не подскажут, напишу ответ. Sorry.
30 июл 17, 21:16    [20686293]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить