Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с разпросом  [new]
user87
Member

Откуда:
Сообщений: 257
Добрый день.

Помогите, пожалуйста, с запросом
Есть запрос, который считает сколько было денег по клиенту за предыдущий месяц

Так же просят написать запрос, который покажет, сколько было денего за предыдущие 4 месяца, пока как вариант вижу точно такой же запрос как ниже
SELECT 
		ClientId	,
		SUM(BetSum) 
	FROM
(
		  SELECT t.ClientId,SUM(ord.Summ) AS Summ
		  FROM Table1 ord
						INNER JOIN #temp t ON ord.ClientId=t.ClientId
		  WHERE ord.ClientId IS NOT NULL AND ord.CreateDate >= DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)-1,0) AND ord.CreateDate < DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
		  GROUP BY t.ClientId
		  UNION
		  SELECT t.ClientId,SUM(ord.Summ) AS Summ
		  FROM Table1 ord
						INNER JOIN #temp t ON ord.tId=t.tId
		  WHERE ord.ClientId IS NULL AND ord.tId IS NOT NULL AND ord.CreateDate>=DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)-1,0) AND ord.CreateDate < DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
		  GROUP BY t.ClientId
 ) AS qqq 
  GROUP BY ClientId


С единственным отличием, что условие c -1 надо будет заменит на -4
  WHERE ord.ClientId IS NOT NULL AND ord.CreateDate >= DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)-1,0) AND ord.CreateDate < DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)



Вопрос нельзя как в одном запросе написать эти два условия, так как запрос работает долго и не хотел бы два раза его запускать в ХП

Заранее благодарен за Ваши ответы
24 июл 14, 12:57    [16351404]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с разпросом  [new]
user87
Member

Откуда:
Сообщений: 257
Т.е хотел бы еще одним столбцом выводить солько денего было за 4 месяца назад

SELECT
ClientId ,
SUM(Summ1) ,
SUM(Summ4)
FROM
24 июл 14, 13:01    [16351428]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с разпросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
user87,

  • нельзя ли пояснить смысл этих двух внутренних SELECTов?
  • Условия JOINов обеспечивают непересекающиеся множества строк?
  • Как учитывается начальный остаток по клиенту на начало периода суммирования?
  • Почему суммируется два раза? Разве одного (снаружи) недостаточно?
  • Обратите внимание на конструкцию SUM(CASE ... WHEN ... THEN ... ELSE 0 END)
  • 24 июл 14, 13:08    [16351466]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с разпросом  [new]
    user87
    Member

    Откуда:
    Сообщений: 257
    Насчет двух суммирований это я переборщил((

    Смысл приблизительно такой, у нас клиенты зарегенные и не зарегенные, первый смотрит тех кто зарегеоись а вторые был, но данные от них остались, как-то так(
    24 июл 14, 13:31    [16351623]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с разпросом  [new]
    _human
    Member

    Откуда:
    Сообщений: 566
    user87,
    это у вас случаем не расчет рисков в банке ?
    24 июл 14, 13:41    [16351702]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с разпросом  [new]
    user87
    Member

    Откуда:
    Сообщений: 257
    Нет
    24 июл 14, 13:52    [16351791]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с разпросом  [new]
    user87
    Member

    Откуда:
    Сообщений: 257
    как вариант попробовал добавить следующим образом

    SELECT 
    		ClientId	,
    		SUM(BetSum) 
    	FROM
    (
    		  SELECT t.ClientId,ord.Summ AS Summ
    		  FROM Table1 ord
    						INNER JOIN #temp t ON ord.ClientId=t.ClientId
    		  WHERE ord.ClientId IS NOT NULL AND ord.CreateDate >= DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)-1,0) AND ord.CreateDate < DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
    
    		  UNION
    		  SELECT t.ClientId,ord.Summ AS Summ
    		  FROM Table1 ord
    						INNER JOIN #temp t ON ord.tId=t.tId
    		  WHERE ord.ClientId IS NULL AND ord.tId IS NOT NULL AND ord.CreateDate>=DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)-1,0) AND ord.CreateDate < DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
    union 
    		  SELECT t.ClientId,ord.Summ AS Summ
    		  FROM Table1 ord
    						INNER JOIN #temp t ON ord.ClientId=t.ClientId
    		  WHERE ord.ClientId IS NOT NULL AND ord.CreateDate >= DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)-4,0) AND ord.CreateDate < DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
    
    		  UNION
    		  SELECT t.ClientId,ord.Summ AS Summ
    		  FROM Table1 ord
    						INNER JOIN #temp t ON ord.tId=t.tId
    		  WHERE ord.ClientId IS NULL AND ord.tId IS NOT NULL AND ord.CreateDate>=DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP)-1,0) AND ord.CreateDate < DATEADD(MONTH,DATEDIFF(MONTH,0,CURRENT_TIMESTAMP),0)
     ) AS qqq 
      GROUP BY ClientId
    


    Как бы мне разделить в что из них за месяц а то за 4 месяца(
    24 июл 14, 14:09    [16351929]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с разпросом  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    SELECT SUM(CASE < по клиенту за предыдущий месяц> ...), SUM( CASE по клиенту за 4 предыдущих месяца)
    24 июл 14, 14:11    [16351942]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с разпросом  [new]
    user87
    Member

    Откуда:
    Сообщений: 257
    Сорри, что туго соображаю, case этот в самое начало вынести?,
    т.е как мне определить какой из них за 1 месяц а какой за 4
    24 июл 14, 14:28    [16352048]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с разпросом  [new]
    user87
    Member

    Откуда:
    Сообщений: 257
    Вопрос снимаю, спасибо большое за подсказки
    24 июл 14, 14:57    [16352241]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить