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

Откуда: ☭
Сообщений: 72952
Таблица:
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
25 авг 04, 15:26    [907490]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Шлёп
25 авг 04, 15:28    [907501]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72952
Хмм... Немного не в тему, кроме того я не настолько силен в sql, чтобы разобраться в смысле того, что там понаписано
25 авг 04, 15:45    [907598]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Каким образом задается период?
25 авг 04, 15:53    [907627]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72952
Where Date>=... and Date<=... для каждого периода, их всего 2
25 авг 04, 16:07    [907696]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
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
25 авг 04, 16:12    [907722]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Вторая редакция
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
25 авг 04, 16:13    [907731]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
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
25 авг 04, 16:16    [907750]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
(c)VIG
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

Куль :)
25 авг 04, 16:20    [907767]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
(c)VIG
Группировка все таки по дате нужна.
А поле Smena я в примере вообще не вижу :)
25 авг 04, 16:21    [907772]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72952
2 All
Не канает
2 Vsevolod V 2я редакция
Выдает ошибку: Подзапрос должен выдавать одно значение
2 (c)VIG
Смены игнорируем, нужны суммы за каждый целый день
25 авг 04, 16:31    [907821]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
assa
Member [заблокирован]

Откуда: мы сами не местные
Сообщений: 3444
можно и так:
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");
25 авг 04, 16:35    [907836]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Geo
Member

Откуда:
Сообщений: 6883
Antonariy
Смены игнорируем, нужны суммы за каждый целый день


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

2 VIG
Порядковый день периода/Значение по периоду 1/Значение по периоду 2
1/1045/810
2/356/1003
3/число/????
, если я правильно понял.
25 авг 04, 16:36    [907842]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
assa
Member [заблокирован]

Откуда: мы сами не местные
Сообщений: 3444
Да, а у VIG а еще INNER JOIN может крякнуться при отсутствии данных в одном из периодов (тут нужен FULL OUTER JOIN)


по поводу игнорирования не понял. Откуда 2 строки?
25 авг 04, 16:38    [907851]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72952
2 Geo: понял правильно, а периоды подразумеваются равной длины, но мало ли что юзверь поставит
25 авг 04, 16:42    [907869]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Geo
Member

Откуда:
Сообщений: 6883
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
25 авг 04, 16:42    [907873]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72952
2 Geo
См. самое начало, данные именно в таком виде: выручка 1й смены за день, выручка 2й смены за день, так же за следующий день, исключений не бывает. Твой пример данных не подходит.
25 авг 04, 16:50    [907913]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
assa
Member [заблокирован]

Откуда: мы сами не местные
Сообщений: 3444
А, понял.

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


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");
25 авг 04, 17:05    [907997]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72952
2 assa: Круто, под акцессом работает, но мне нужно этот запрос выполнять из VB, а под ним ругань: слишком мало параметров - требуется 2
25 авг 04, 17:31    [908108]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
assa
Member [заблокирован]

Откуда: мы сами не местные
Сообщений: 3444
для (в том числе) пересекающихся периодов - что -то вида:

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]).
25 авг 04, 17:42    [908160]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
Блин, ну когда уже народ научиться нормально обьяснять ,что требуется.
Ну ,если действительно
автор
данные именно в таком виде: выручка 1й смены за день, выручка 2й смены за день, так же за следующий день, исключений не бывает
то можно так :
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
25 авг 04, 21:48    [908532]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
assa
Member [заблокирован]

Откуда: мы сами не местные
Сообщений: 3444
VIG
Ну ,если действительно...
автор
...исключений не бывает


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

Ибо...
26 авг 04, 10:47    [909159]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Евгений12345
Member

Откуда:
Сообщений: 16
Если я верно понял автору необходимо сравнить два периода по месяцам, например:
период 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. По моему все работает с любым количеством дней в периодах, и с пересекающимися датами тоже.
27 авг 04, 04:13    [912638]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить