Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверка на 0 в запросе MsSQL 
:(
    Опции темы
str_killer
Дата 26.8.2008, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



MsSQL
есть две таблички: sortament и prihod
в sortament: id_sortament, ...
в prihod: id_prihod и id_sortament(из первой), т.е в первой сортамент, а во второй приходы по данному сортаменту(привязка через id_sortament)

есть такой запрос
Код

SELECT     sortament.id_sortament, COUNT(prihod.id_prihod) AS kolvo
FROM         sortament LEFT OUTER JOIN
                      prihod ON prihod.id_sortament = sortament.id_sortament
GROUP BY sortament.id_sortament
, 
который возвращает все ИДшники из первой таблицы и кол-во строк из второй таблицы, с соответствующим ИДшником.

Вопрос: как сделать, чтобы если количество строк из второй таблицы равнялось 0, то вместо нуля выводилось бы какое-нибудь не нулевое число например 999?

пример, есть
id_sortament  kolvo
1                     1
2                     0
3                     3
4                     0
нужно 
id_sortament  kolvo
1                     1
2                     999
3                     3
4                     999
Помогите пожалуйста smile  

Это сообщение отредактировал(а) str_killer - 26.8.2008, 08:29
PM MAIL   Вверх
Akina
Дата 26.8.2008, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

SELECT sortament.id_sortament, 
       Case COUNT(prihod.id_prihod) 
         When 0 
            Then 999 
         Else 
            COUNT(prihod.id_prihod) 
         END AS kolvo
FROM sortament 
LEFT OUTER JOIN prihod 
   ON prihod.id_sortament = sortament.id_sortament
GROUP BY sortament.id_sortament



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
str_killer
Дата 26.8.2008, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Спасибо, Akina! Про кейс то я и зобыл((
PM MAIL   Вверх
str_killer
Дата 26.8.2008, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



такой вопрос:
есть три таблички: : sortament, prihod и rashod
в sortament: id_sortament, ...
в prihod: id_prihod, kolvo и id_sortament(из первой), т.е в первой сортамент, а во второй приходы по данному сортаменту(привязка через id_sortament)
в rashod: id_rashod, kolvo и id_sortament(из первой), т.е в первой сортамент, а в третьей расходы по данному сортаменту(привязка через id_sortament)

нужно посчитать сумму поля kolvo всех приходов и вычесть все расходы по каждому сортаменту, делаю так:
Код

SELECT DISTINCT 
sortament.id_sortament,
sum(isnull(prihod.kolvo,0)) - sum(isnull(rashod.kolvo),0) as kolvo_all
FROM         sortament left OUTER JOIN
                      rashod ON sortament.id_sortament = rashod.id_sortament left OUTER JOIN
                      prihod ON sortament.id_sortament = prihod.id_sortament
group by sortament.id_sortament
having (sum(isnull(prihod.kolvo,0)) - sum(isnull(rashod.kolvo),0))>0
, 
а данные получаются неверные(((

пример:
prihod
id_sortament  id_prihod kolvo
1                     1              5
1                     2              10
2                     3              20
2                     4              30

rashod
id_sortament  id_rashod kolvo
1                     1               1
2                     2               2
2                     3               3
2                     4               4

должно получица:
id_sortament kolvo_all
1                    14
2                    41
а получается типа этого:
id_sortament kolvo_all
1                    13(5+10-2*1)
2                    ~12.17((20+30)/3-(2+3+4)/2)
т.е, суммарное кол-во прихода делица на колво строк в расходе и наоборот и потом только вычитаюца
как переделать запрос?


Это сообщение отредактировал(а) str_killer - 26.8.2008, 09:42
PM MAIL   Вверх
Akina
Дата 26.8.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(str_killer @  26.8.2008,  10:40 Найти цитируемый пост)
как переделать запрос?

Лучше переделай структру базы. Оставь одну таблицу движения мат. средств, и расходы пиши отрицательными.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
str_killer
Дата 26.8.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Akina, Идея конечно неплохая, если бы таблички прихода и расхода имели только эти поля, проблема в том что это единственные общие поля в этих таблицах, а остальная структура очень сильно различается, поэтому совместить их проблематично, вот и напрягаюсь потихонечку
PM MAIL   Вверх
source777
Дата 26.8.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(str_killer @  26.8.2008,  09:40 Найти цитируемый пост)
нужно посчитать сумму поля kolvo всех приходов и вычесть все расходы по каждому сортаменту, делаю так:

И что работает? Там у тебя в запросе целая куча ошибок, например,
Цитата

sum(isnull(rashod.kolvo),0)

Цитата

DISTINCT 
sortament.id_sortament
...
group by sortament.id_sortament



Цитата(str_killer @  26.8.2008,  10:07 Найти цитируемый пост)
а остальная структура очень сильно различается, поэтому совместить их проблематично, вот и напрягаюсь потихонечку 

Ну так напрягайся сам, подучи SQL, потренируйся на сайте http://www.sql-ex.ru/exercises.php и напрягайся сколько влезет...


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Akina
Дата 26.8.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(str_killer @  26.8.2008,  11:07 Найти цитируемый пост)
это единственные общие поля в этих таблицах, а остальная структура очень сильно различается, поэтому совместить их проблематично

Тогда source777 прав - учи матчасть. Проблемы - от недостатка знаний.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
str_killer
Дата 26.8.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



source777

 
Цитата

И что работает? Там у тебя в запросе целая куча ошибок, например,

сами таблицы очень большие и чтобы было понятнее я привел примеры на придуманных таблицах и запрос написал ручками, поэтому не заметил пару ошипок))), что в принципе некритично, мне же нужна идея как это можно сделать, поэтому примерный запрос вполне показывает ситуацию

если это так критично для тебя вот запрос без ошипок.... вроде бы
Код

SELECT 
sortament.id_sortament,
sum(isnull(prihod.kolvo,0)) - sum(isnull(rashod.kolvo,0)) as kolvo_all
FROM         sortament left OUTER JOIN
                      rashod ON sortament.id_sortament = rashod.id_sortament left OUTER JOIN
                      prihod ON sortament.id_sortament = prihod.id_sortament
group by sortament.id_sortament
having (sum(isnull(prihod.kolvo,0)) - sum(isnull(rashod.kolvo,0)))>0

 
Цитата

Ну так напрягайся сам

спасибо, этим и занимаюсь, можешь помочь - помоги, не можешь - извини, тебе в другую тему тогда ;)))

Добавлено @ 11:09
Цитата(Akina @  26.8.2008,  11:00 Найти цитируемый пост)
Тогда source777 прав - учи матчасть. Проблемы - от недостатка знаний

Если бы не было недостатка в знаниях, я бы и не создавал эту тему, пытаюсь понять как это можно сделать, вот и решил может кто поможет;))

Это сообщение отредактировал(а) str_killer - 26.8.2008, 12:05
PM MAIL   Вверх
Akina
Дата 26.8.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



str_killer, ты привел пример наполнения таблиц в посте за 26.8.2008, 10:40.
Допустим, в таблице сортамента есть 2 записи с ИД 1 и 2.
Построй ВРУЧНУЮ на листе бумаги ту самую выборку, которая является источником отбора в твоем запросе - т.е. сортамент и связанные туда приход и расход. а?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
str_killer
Дата 26.8.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Цитата(Akina @  26.8.2008,  12:03 Найти цитируемый пост)
Построй ВРУЧНУЮ на листе бумаги ту самую выборку, которая является источником отбора в твоем запросе - т.е. сортамент и связанные туда приход и расход

А можно как-нибудь одним запросом привязать две таблицы к одной, не связав их с собой или только вложенными запросами?

Добавлено через 1 минуту и 45 секунд
я понимаю, что таблицы неправильно завязаны, но что-то недогоняю, как правильно(((
PM MAIL   Вверх
source777
Дата 26.8.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(str_killer @  26.8.2008,  11:03 Найти цитируемый пост)
спасибо, этим и занимаюсь, можешь помочь - помоги, не можешь - извини, тебе в другую тему тогда ;)))


Запрос то сварганить не сложно, вот только тебе от этого лучше не будет, а лучше будет - когда сможешь самостоятельно думать.  Сходи всё-таки на сайт, который я тебе рекомендовал...

Выполни такой запрос и догадайся как доделать самостоятельно...
Код

  SELECT id_sortament, kolvo AS dx, [date]
  FROM prihod
  UNION
  SELECT id_sortament, -kolvo AS dx, [date]
  FROM rashod

Предполагается что в твоих таблицах есть столбец date, поддерживающий уникальность набора {id_sortament, kolvo, date} в пределах таблицы, короче первичный ключ должен входить в оба селекта, но ты не указал, что у тебя там является первичным ключём...

Это сообщение отредактировал(а) source777 - 26.8.2008, 13:21


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
str_killer
Дата 26.8.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Цитата(source777 @  26.8.2008,  13:15 Найти цитируемый пост)
когда сможешь самостоятельно думать

думать самостоятельно получается(очень понравилось ))), просто с sql  мало дел имею и запросы, которые посложнее не всегда получаются
Цитата(source777 @  26.8.2008,  13:15 Найти цитируемый пост)
Сходи всё-таки на сайт, который я тебе рекомендовал...

спасибо будет время поразбираюсь
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.