Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите с запросом / 23 сообщений из 23, страница 1 из 1
25.08.2004, 15:26:27
    #32665042
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Таблица:
ID (identity)|Smena| Date | SingleSum
1 01.02.04 458
2 01.02.04 587
1 02.02.04 188
2 02.02.04 168
1 03.02.04 234
2 03.02.04 576
1 04.02.04 237
2 04.02.04 766

Нужно создать выборку сумм по дате за два периода напрмер с 1 по 2 и с 3 по 4 чтобы получилось:
период1 | период2
1045 810
356 1003
...
Рейтинг: 0 / 0
25.08.2004, 15:28:11
    #32665050
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
...
Рейтинг: 0 / 0
25.08.2004, 15:45:46
    #32665098
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Хмм... Немного не в тему, кроме того я не настолько силен в sql, чтобы разобраться в смысле того, что там понаписано
...
Рейтинг: 0 / 0
25.08.2004, 15:53:10
    #32665112
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Каким образом задается период?
...
Рейтинг: 0 / 0
25.08.2004, 16:07:51
    #32665154
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Where Date>=... and Date<=... для каждого периода, их всего 2
...
Рейтинг: 0 / 0
25.08.2004, 16:12:08
    #32665173
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Код: plaintext
1.
2.
select (select sum(SingleSum) from MyTable Where Date>=... and Date<=... ) as период1,
(select sum(SingleSum) from MyTable Where Date>=... and Date<=... ) as период2 
from MyTable
...
Рейтинг: 0 / 0
25.08.2004, 16:13:30
    #32665178
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Вторая редакция
Код: plaintext
1.
2.
3.
4.
select (select sum(SingleSum) from MyTable 
Where Date>=... and Date<=... Group by DATE) as период1,
(select sum(SingleSum) from MyTable 
Where Date>=... and Date<=... Group by DATE) as период2 
from MyTable
...
Рейтинг: 0 / 0
25.08.2004, 16:16:49
    #32665187
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
a.Select smena,a.s1 as Period1,b.s2 as Period1
FROM
      (select smena,sum(SingleSum)  as s1 from table t
       where  t.[Date] between  # 02 / 01 / 04 # AND # 02 / 01 / 04 #
       group by smena) as a
INNER JOIN
      (select smena,sum(SingleSum) as s2 from table t
      where t.[Date] between  # 03 / 01 / 04 # AND # 04 / 01 / 04 #
      group by smena) as b
on a.smena=b.smena
...
Рейтинг: 0 / 0
25.08.2004, 16:20:03
    #32665200
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
(c)VIG
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
a.Select smena,a.s1 as Period1,b.s2 as Period1
FROM
      (select smena,sum(SingleSum)  as s1 from table t
       where  t.[Date] between  # 02 / 01 / 04 # AND # 02 / 01 / 04 #
       group by smena) as a
INNER JOIN
      (select smena,sum(SingleSum) as s2 from table t
      where t.[Date] between  # 03 / 01 / 04 # AND # 04 / 01 / 04 #
      group by smena) as b
on a.smena=b.smena

Куль :)
...
Рейтинг: 0 / 0
25.08.2004, 16:21:38
    #32665203
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
(c)VIG
Группировка все таки по дате нужна.
А поле Smena я в примере вообще не вижу :)
...
Рейтинг: 0 / 0
25.08.2004, 16:31:03
    #32665229
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
2 All
Не канает
2 Vsevolod V 2я редакция
Выдает ошибку: Подзапрос должен выдавать одно значение
2 (c)VIG
Смены игнорируем, нужны суммы за каждый целый день
...
Рейтинг: 0 / 0
25.08.2004, 16:35:13
    #32665239
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
можно и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
PARAMETERS 
     DATE1 DateTime,
     DATE2 DateTime,
     DATE3 DateTime,
     DATE4 DateTime;
TRANSFORM Sum([~t].SingleSum) AS [Значение]
SELECT [~t].Smena
FROM [~t]
WHERE ((Not (Switch([Date] Between [Date1] And [Date2],
    "Период 1",
    [Date] Between [Date3] And [Date4],
    "Период 2")) Is Null))
GROUP BY [~t].Smena
PIVOT
    Switch([Date] Between [Date1] And [Date2],
    "Период 1",
    [Date] Between [Date3] And [Date4],
    "Период 2")
    IN ("Период 1","Период 2");
...
Рейтинг: 0 / 0
25.08.2004, 16:36:29
    #32665242
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
AntonariyСмены игнорируем, нужны суммы за каждый целый день

А что, разве сказано, что периоды обязательно равной величины?

2 VIG
Порядковый день периода/Значение по периоду 1/Значение по периоду 2
1/1045/810
2/356/1003
3/число/????
, если я правильно понял.
...
Рейтинг: 0 / 0
25.08.2004, 16:38:37
    #32665248
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Да, а у VIG а еще INNER JOIN может крякнуться при отсутствии данных в одном из периодов (тут нужен FULL OUTER JOIN)


по поводу игнорирования не понял. Откуда 2 строки?
...
Рейтинг: 0 / 0
25.08.2004, 16:42:33
    #32665263
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
2 Geo: понял правильно, а периоды подразумеваются равной длины, но мало ли что юзверь поставит
...
Рейтинг: 0 / 0
25.08.2004, 16:42:54
    #32665266
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
2 Автор
Покажи, пожалуйста, требуемый результат для таких данных:

D (identity)|Smena| Date | SingleSum
1 01.02.04 458
2 03.02.04 168
2 04.02.04 766
1 05.02.04 234
2 06.02.04 576
2 07.02.04 576


И заданных периодов:
с 1/02/04 по 3/02/04
с 4/02/04 ао 7/02/04
...
Рейтинг: 0 / 0
25.08.2004, 16:50:04
    #32665293
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
2 Geo
См. самое начало, данные именно в таком виде: выручка 1й смены за день, выручка 2й смены за день, так же за следующий день, исключений не бывает. Твой пример данных не подходит.
...
Рейтинг: 0 / 0
25.08.2004, 17:05:20
    #32665348
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
А, понял.

Тогда (но только для непересекающихся периодов):


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
PARAMETERS
    DATE1 DateTime,
    DATE2 DateTime,
    DATE3 DateTime,
    DATE4 DateTime;
TRANSFORM Sum([~t].SingleSum) AS [Значение]
SELECT
    Switch([Date] Between [Date1] And [Date2],
    [Date]-[Date1],
    [Date] Between [Date3] And [Date4],
    [Date]-[Date3]) AS NDay
FROM [~t]
WHERE
    ((Not (Switch([Date] Between [Date1] And [Date2],
    "Период 1",[Date] Between [Date3] And [Date4],
    "Период 2")) Is Null))
GROUP BY
    Switch([Date] Between [Date1] And [Date2],
   [Date]-[Date1],
   [Date] Between [Date3] And [Date4],
   [Date]-[Date3])
PIVOT
    Switch([Date] Between [Date1] And [Date2],
   "Период 1",[Date] Between [Date3] And [Date4],
   "Период 2") In ("Период 1","Период 2");
...
Рейтинг: 0 / 0
25.08.2004, 17:31:07
    #32665425
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
2 assa: Круто, под акцессом работает, но мне нужно этот запрос выполнять из VB, а под ним ругань: слишком мало параметров - требуется 2
...
Рейтинг: 0 / 0
25.08.2004, 17:42:19
    #32665460
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
для (в том числе) пересекающихся периодов - что -то вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
PARAMETERS DATE1 DateTime, DATE2 DateTime, DATE3 DateTime, DATE4 DateTime;
SELECT NDay,  Sum([sПериод1]) AS Период1,   Sum([sПериод2]) AS Период2
FROM 
(
      SELECT [Date]-[Date1] AS NDay, 
       Sum([SingleSum]) AS sПериод1,  0  as sПериод2
      FROM [~t]
      WHERE [Date] Between [Date1] And [Date2]
      GROUP BY [Date]-[Date1]
      UNION ALL
      SELECT [Date]-[Date3] AS NDay,  0  AS sПериод1, Sum([SingleSum]) AS sПериод2
      FROM [~t]
      WHERE [Date] Between [Date3] And [Date4]
      GROUP BY [Date]-[Date3]
) AS q
GROUP BY NDay ;

- не могу проверить - 97 - приходится подзапрос выделять в отдельный (и переносит туда параметры).


__
ЗЫ для VB э-убери объявления а-параметров и а-строку а-шей а-в-коде (вшивай даты в SQL-строку вместо [DATEx]).
...
Рейтинг: 0 / 0
25.08.2004, 21:48:56
    #32665732
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Блин, ну когда уже народ научиться нормально обьяснять ,что требуется.
Ну ,если действительно авторданные именно в таком виде: выручка 1й смены за день, выручка 2й смены за день, так же за следующий день, исключений не бывает то можно так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select q1.Period1,q2.Period2
from
(
 select n,sum(SingleSum) as Period1
 from
 (
  select [date],SingleSum,(select count(*) from table as t1 where   t1.[date]<=t.[date]) as n
  from table as t
  where t.date between d11 and d12) as a
  group by n
) as q1
INNER JOIN
(
 select n,sum(SingleSum) as Period2
 from
 (
  select [date],SingleSum,(select count(*) from table as t1 where t1.[date]<=t.[date]) as n
  from table as t
  where t.date beetween d21 and d22) as a
  group by n
) as q2
ON q1.n=q2.n
...
Рейтинг: 0 / 0
26.08.2004, 10:47:28
    #32666121
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
VIGНу ,если действительно... автор...исключений не бывает

Опытный программер такие заявления воспринимает с точностью до наоборот

Ибо...
...
Рейтинг: 0 / 0
27.08.2004, 04:13:31
    #32668002
Евгений12345
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Если я верно понял автору необходимо сравнить два периода по месяцам, например:
период 1 с 01.02.04 по 02.02.04 |период 2 с 03.02.04 по 04.02.04
или
период 1 с 01.02.04 по 02.02.04 |период 2 с 06.02.04 по 08.02.04
в общем разне периоды до нескольких лет например (в том числе и пересекающиеся
период 1 с 01.02.04 по 05.02.04 |период 2 с 04.02.04 по 09.02.04
причем количество дней в периода 1 = кол дням периода 2
Есть такой вариант:
(5 запросов. одним не могу)
поля таблица1
DateDat
SingleSum

запрос "Серия1"
PARAMETERS [начало периода] DateTime, [конец периода] DateTime;
SELECT t1.DateDat AS DateDatS1, Sum(t1.SingleSum) AS Sum_SingleSum
FROM Таблица1 AS t1
GROUP BY t1.DateDat
HAVING (((t1.DateDat)>=[начало периода] And (t1.DateDat)<=[конец периода]));

Запрашивает начало и конец периода
________________________________________
Запрос "Серия2"
PARAMETERS [Выберете интервал] Long;
SELECT t1.DateDat, Sum(t1.SingleSum) AS Sum_SingleSum
FROM Таблица1 AS t1
GROUP BY t1.DateDat
HAVING ((([t1].[DateDat])>=DateAdd("d",[Выберете интервал],(select min(Серия1.DateDatS1) from Серия1)) And ([t1].[DateDat])<=DateAdd("d",[Выберете интервал],(select max(Серия1.DateDatS1) from Серия1))));

Запрашивает интервал и в зависимости от начала и конца преиода выбранного в первом запросе выбирает соответствующие начало и конец второго периода.
Например интервал равный 3 выберет для второго периода даты на три мес позже(01.02.04 > 01.05.04 и т.д.)
_______________________________________
Запрос "Серия12"
SELECT S1.DateDatS1, S1.Sum_SingleSum, (select sum(1) from Серия1 S2 where S1.DateDatS1 >= S2.DateDatS1) AS номер
FROM Серия1 AS S1;

Нумерует строки "Серия1"(повозрастанию дат) для последующего сведения
_______________________________________
Запрос "Серия22"
SELECT S1.DateDat, S1.Sum_SingleSum, (select sum(1) from Серия2 S2 where S1.DateDat >= S2.DateDat) AS номер
FROM Серия2 AS S1;

Нумерует строки "Серия2"(повозрастанию дат) для последующего сведения
_______________________________________
Запрос "СерияAll"
SELECT Серия12.DateDatS1, Серия12.Sum_SingleSum, Серия22.DateDat, Серия22.Sum_SingleSum
FROM Серия12 INNER JOIN Серия22 ON Серия12.номер = Серия22.номер;

Сводит всё до кучи
PS. По моему все работает с любым количеством дней в периодах, и с пересекающимися датами тоже.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите с запросом / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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