Нужна помощь в получении данных

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Ramzes14
Сообщения: 2
Зарегистрирован: 03 ноя 2004, 22:42

Нужна помощь в получении данных

Сообщение Ramzes14 » 03 ноя 2004, 22:51

Доброе время суток Уважаемый АЛЛ !
Есть БД в ней есть таблицы:
-Docs хранит шапки документов

Код: Выделить всё

        `GUID_Doc` 
        `GUID_Tip_Doc` , 
        особого внимания заслуживает это поле 
        которое содержит одно из значений:
            1,Прих. накладная
            2,Расх. накладная
            3,Возвратная накладная нам
            4,Возвратная накладная поставщикам
            5,Перемещение товара
            12,Введение остатков товара
            13,Списание товара
        `GUID_Kontragent` 
        `GUID_Dost` 
        `Data_Doc`
        ...
-Docs_Pochenen хранит табличную часть документов если такие имеются

Код: Выделить всё

        `GUID_Doc` 
        `GUID_Post` 
        `GUID_Doc_Podchenen` 
        `GUID_Tov` int(11) 
        `GUID_Tov_Partii` 
        `Kol_Tov` 
        `ZenaZ` 
        `ZenaD` 
        `ZenaP` 
        ...
-Tov хранит данные о товарах

Код: Выделить всё

        `GUID_Group` 
        `GUID_Kontragent` 
        `GUID_Tov` 
        `Nazv` 
        ...
-Tov_Partii хранит данные о партиях товаров

Код: Выделить всё

        `GUID_PN` 
        `GUID_TOV` 
        `GUID_Tov_Partii` 
        `ZenaZ` 
        ...
 
Фухх
Так вот, сама суть проблемы -мне нужно получить такие данные:
Наименование-фактически GUID_Tov_Partii
Принято -Остаток с предыдущего дня
Добавлено -Добавлено за день(соответствует документам 1 и 3(с минусом разумеется) типа)
Продано -Продано за день (соответствует документам 2 и 4(с минусом разумеется) типа)
Переведено -Переведено товара с склада на склад(5 тип документа при чем используется как для перевода в одном направлении так и в обраном меняются значения полей `GUID_Kontragent`(отправитель) `GUID_Dost` (получатель)
Получено -Противоположность предыдущего поля
Списано -Списано товара за день(13 тип документа)
Остаток -расчетная величина (Принято+Добавлено+Получено)-(Переведено+Продано+Списано)

Вот такая проблема готов выслушать любые конструктивные предложения
использовать можно все ХП,Представления,Временные таблицы и т.д.

ЗЫ Извиняюсь за столь длинный пост но есть проблема, а решения нет

Ramzes14
Сообщения: 2
Зарегистрирован: 03 ноя 2004, 22:42

Немного конкретизации

Сообщение Ramzes14 » 03 ноя 2004, 22:57

Такс попробую конкретизировать проблему

Выборка для поля Добавлено

Код: Выделить всё

    SELECT 
        docs.Data_Doc, 
        docs_podchenen.GUID_Post, 
        docs_podchenen.GUID_Tov, 
        docs_podchenen.GUID_Tov_Partii, 
        Sum(If(GUID_Tip_Doc=1,Kol_Tov,-Kol_Tov)) AS sPrin
    FROM 
        docs INNER JOIN docs_podchenen ON docs.GUID_Doc=docs_podchenen.GUID_Doc
    Where 
        docs.GUID_Dost=1 AND    
        docs.Data_Doc='2004-10-02' AND
        docs.GUID_Tip_Doc in (1,4)
    GROUP BY 
        docs_podchenen.GUID_Tov_Partii;
 
Выборка для поля Продано

Код: Выделить всё

    SELECT 
        docs.Data_Doc, 
        docs_podchenen.GUID_Post, 
        docs_podchenen.GUID_Tov, 
        docs_podchenen.GUID_Tov_Partii, 
        Sum(If(GUID_Tip_Doc=2,Kol_Tov,-Kol_Tov)) AS sProd
    FROM 
        docs INNER JOIN docs_podchenen ON docs.GUID_Doc=docs_podchenen.GUID_Doc
    Where 
        docs.GUID_Dost=1 AND    
        docs.Data_Doc='2004-10-02' AND
        docs.GUID_Tip_Doc in (2,3)
    GROUP BY 
        docs_podchenen.GUID_Tov_Partii;
 
Выборка для поля Переведено

Код: Выделить всё

   
 SELECT 
        docs.Data_Doc, 
        docs_podchenen.GUID_Post, 
        docs_podchenen.GUID_Tov, 
        docs_podchenen.GUID_Tov_Partii, 
        Sum(Kol_Tov) AS sPerev
    FROM 
        docs INNER JOIN docs_podchenen ON docs.GUID_Doc=docs_podchenen.GUID_Doc
    Where 
        docs.GUID_Kontragent=1 AND    
        docs.Data_Doc='2004-10-02' AND
        docs.GUID_Tip_Doc=5
    GROUP BY 
        docs_podchenen.GUID_Tov_Partii;
 
Выборка для поля Получено

Код: Выделить всё

   
 SELECT 
        docs.Data_Doc, 
        docs_podchenen.GUID_Post, 
        docs_podchenen.GUID_Tov, 
        docs_podchenen.GUID_Tov_Partii, 
        Sum(If(GUID_Tip_Doc=2,Kol_Tov,-Kol_Tov)) AS sPoluch
    FROM 
        docs INNER JOIN docs_podchenen ON docs.GUID_Doc=docs_podchenen.GUID_Doc
    Where 
        docs.GUID_Dost=1 AND    
        docs.Data_Doc='2004-10-02' AND
        docs.GUID_Tip_Doc =5
    GROUP BY 
        docs_podchenen.GUID_Tov_Partii;


Вотс это все понятно но как дальше собрать это все до кучи не понимаю
Получается что обьединение типа
Tov_Partii INNER JOIN TMP ON Tov_Partii.GUID_Tov_Partii=Tmp.GUID_Tov_Partii


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

Рустем
Сообщения: 9
Зарегистрирован: 03 ноя 2004, 10:37

Сообщение Рустем » 04 ноя 2004, 14:06

Если интересует выборка по всем операциям движения товара, то
делаешь такой бутерброд:
Select ...,
(select к_твоей таблице_ДОБАВЛЕНО),
(select к_твоей таблице_ПРОДАНО),
(select к_твоей таблице_...),
...,
(если нужны суммы по предыдущим полям, то все эти скобки с (Select...)
суммируешь/вычитаешь)
from...
where...

Ответить