SQL-запрос

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

SQL-запрос

Сообщение Scuder » 05.05.2005 (Чт) 12:30

MS SQL 2000.

Есть таблица, допустим, такого вида: pDate, pSum, pType

где pType принимает значения, скажем, от 0 до 100.

Нужно сделать такую выборку, чтобы в одном рекордсете были выведены pDate, Sum(pSum), Sum(pSum).
Но в первом Sum() только те записи, где pType>0, а во втором - pType=0.

Скажите, это в принципе возможно?? :shock:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.05.2005 (Чт) 12:36

через временную таблицу

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 05.05.2005 (Чт) 12:37

Конечно. Про алиасы объектов в запросе слыхал?

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 05.05.2005 (Чт) 12:40

Ennor писал(а):Конечно. Про алиасы объектов в запросе слыхал?


Нет, не слыхал. :-( Можно какой-нибудь примерчик?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 05.05.2005 (Чт) 12:49

Код: Выделить всё
select IsNull(t.pDate, t1.pDate) as [pDateField], sum(t.pSum) as [SumPositive],
  sum(t1.pSum) as [SumNegative]
from Table1 t
  full join Table1 t1 on t.pDate = t1.pDate
where t.pType > 0
  and t1.pType = 0
group by IsNull(t.pDate, t1.pDate)

Прикол в том, что здесь делается джойн таблицы на саму себя, и чтобы как-то различать эти два экземпляра, вводится понятие алиас. Кстати, фича из ANSI SQL, так что работает везде.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 05.05.2005 (Чт) 13:11

Ennor, запрос работает, но как-то неправильно.. Я, если честно, вообще не догоняю, что за бред он мне выдаёт.. :-(

Вот запрос, подогнанный под реальную таблицу:

Код: Выделить всё
SELECT     ISNULL(t.pDate, t1.pDate) AS pDateField, SUM(t.TotalSum) AS SumPositive, SUM(t1.TotalSum) AS SumNegative
FROM         Payments t FULL OUTER JOIN
                      Payments t1 ON t.pDate = t1.pDate
WHERE     (t.ServiceType > 0) AND (t1.ServiceType = 0) AND (t.pDate = '4/27/2005')
GROUP BY ISNULL(t.pDate, t1.pDate)

Вот результат:

    pDateField-SumPositive-SumNegative
    27.04.2005-1540000-110880

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

    pDateField-SumPositive-SumNegative
    27.04.2005-5370-80


Где ошибка?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.05.2005 (Чт) 14:34

Код: Выделить всё
SELECT     pDate AS Data, SUM(pSum) AS SummaMinus,
                          (SELECT     SUM(a.pSum)
                            FROM          Payments a
                            WHERE      a.pType > 0
                            GROUP BY a.pDate
                            HAVING      a.pDate = pDate) AS SummaPlus
FROM         Payments
WHERE     (pType = 0)
GROUP BY pDate

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.05.2005 (Чт) 14:39

работает только для одной выбранной даты

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.05.2005 (Чт) 14:41

Исправлено, работает для любого кол-ва дат:

Код: Выделить всё
SELECT     pDate AS Data, SUM(pSum) AS SummaMinus,
                          (SELECT     SUM(a.pSum)
                            FROM          Payments a
                            WHERE      a.pType > 0
                            GROUP BY a.pDate
                            HAVING      a.pDate = p.pDate) AS SummaPlus
FROM         Payments p
WHERE     (pType = 0)
GROUP BY pDate

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 05.05.2005 (Чт) 14:48

Konst_One

Ага, работает. Спасибо большое! :-)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList