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

Откуда:
Сообщений: 2
Здравствуйте уважаемые форумчане.
Начал я изучать SQL, посмотрел базовые операции и встретил задачу, для которых мне не хватает знаний.

Можете пожалуйста помочь?
Вроде должно быть не сложно, но у меня получается.

Имеется таблица(прикреплена в виде Excel), четыре поля (id_client, date, sale, client_value).


id_client date sales client_value
132 01.01.2010 432 56
145 01.01.2010 235 34
147 01.01.2010 25 35
132 01.02.2010 345 23
132 01.03.2010 26 45
145 01.02.2010 62 53
147 01.02.2010 53 25
234 01.01.2010 42 47
145 01.03.2010 94 12

Задача вывести таблицу в которой:
1) первый столбец запись об id каждого клиента
2) второй столбец sales для данного клиента на 01.01.2010
3) третий столбец client_value для данного клиента на 01.02.2010
4) четвертый столбец client_value для данного клиента на 01.03.2010
5) пятый столбец по каждому клиенту сумма показателя sales за 3 месяца
6) шестой столбец по каждому клиенту среднее показателя client_value за 3 месяца
7) седьмой столбец по каждому клиенту максимальное значение показателя client_value за 3 месяца


я смог пока сделать только таблицу клиентов с показателем sales на 01.01.2010


SELECT ID_CLIENT, SALES FROM `table` WHERE DATE='01.01.2010'

К сообщению приложен файл (Для примера.xlsx - 8Kb) cкачать
4 апр 19, 19:39    [21853176]     Ответить | Цитировать Сообщить модератору
 Re: Задача для новичка в SQL  [new]
Полковник.
Member

Откуда:
Сообщений: 1831
roman.kurbatov,
Что то еще знаешь про sql кроме where? Про join что то слышал?
4 апр 19, 20:02    [21853198]     Ответить | Цитировать Сообщить модератору
 Re: Задача для новичка в SQL  [new]
roman.kurbatov
Member

Откуда:
Сообщений: 2
Полковник.,

Сейчас посмотрел, но не понимаю как эту конструкцию применять к моей задаче.

Пробую так:

INNER JOIN CLIENT_VALUE first_table ON DATE='01.02.2010';

Выдает ошибку
4 апр 19, 20:27    [21853228]     Ответить | Цитировать Сообщить модератору
 Re: Задача для новичка в SQL  [new]
londinium
Member

Откуда: Киев
Сообщений: 1075
roman.kurbatov,
USE MASTER
GO

WITH CTE(CLIENT_ID,DATED,DATE_SALES,CLIENT_VALUE)
AS
(
  SELECT 145,'20100301',94,12
   UNION ALL
  SELECT 234,'20100101',42,47
   UNION ALL
  SELECT 147,'20100201',53,25
   UNION ALL
  SELECT 145,'20100201',62,53
   UNION ALL
  SELECT 132,'20100301',26,45
   UNION ALL
  SELECT 132,'20100201',345,23
    UNION ALL
  SELECT 147,'20100101',25,35
   UNION ALL
  SELECT 145,'20100101',235,34
   UNION ALL
  SELECT 132,'20100101',432,56           
)

SELECT DISTINCT C.CLIENT_ID,ISNULL(SALES1.SUM_SALES_01_01_2010,0.00)AS SUM_SALES_01_01_2010
FROM CTE AS C
LEFT JOIN
(
  SELECT CC.CLIENT_ID,SUM(DATE_SALES)AS SUM_SALES_01_01_2010
   FROM CTE AS CC
   WHERE CC.DATED='20100101'
   GROUP BY CC.CLIENT_ID
)AS SALES1 ON C.CLIENT_ID=SALES1.CLIENT_ID

Такое надо?
4 апр 19, 21:21    [21853268]     Ответить | Цитировать Сообщить модератору
 Re: Задача для новичка в SQL  [new]
L.Otujktd
Member

Откуда:
Сообщений: 40
roman.kurbatov,
Проще написать и отладить отдельные запросы, а потом сделать требуемый Join-от простого к сложному,так сказать. Удачи!
4 апр 19, 22:09    [21853296]     Ответить | Цитировать Сообщить модератору
 Re: Задача для новичка в SQL  [new]
Dshedoo
Member

Откуда:
Сообщений: 288
WITH CTE(CLIENT_ID,DATED,SALES,CLIENT_VALUE)
AS
(
  SELECT 145,'20100301',94,12 from dual UNION ALL
  SELECT 234,'20100101',42,47 from dual UNION ALL
  SELECT 147,'20100201',53,25 from dual UNION ALL
  SELECT 145,'20100201',62,53 from dual UNION ALL
  SELECT 132,'20100301',26,45 from dual UNION ALL
  SELECT 132,'20100201',345,23 from dual UNION ALL
  SELECT 147,'20100101',25,35 from dual UNION ALL
  SELECT 145,'20100101',235,34 from dual UNION ALL
  SELECT 132,'20100101',432,56 from dual           
)

select client_id
, sum(case when dated = 20100101 then sales else 0 end)
, sum(case when dated = 20100201 then client_value else 0 end)
, sum(case when dated = 20100301 then client_value else 0 end)
, sum(sales)
, sum(client_value)
, max(client_value)
 from cte
group by client_id
5 апр 19, 08:43    [21853520]     Ответить | Цитировать Сообщить модератору
 Re: Задача для новичка в SQL  [new]
Жук в муравейнике
Member

Откуда:
Сообщений: 699
Dshedoo, за 3 месяца
15 апр 19, 00:33    [21861814]     Ответить | Цитировать Сообщить модератору
 Re: Задача для новичка в SQL  [new]
Жук в муравейнике
Member

Откуда:
Сообщений: 699
sum(sales)        over(partition by id_client order by date range between interval '3' month and current row) n5,
avg(client_value) over(partition by id_client order by date range between interval '3' month and current row) n6,
max(client_value) over(partition by id_client order by date range between interval '3' month and current row) n7
15 апр 19, 00:47    [21861819]     Ответить | Цитировать Сообщить модератору
Все форумы / Работа Ответить