Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

SQL-zespalanie wierszy z jeden tabeli za pomocą insert'a lub update'a w drugiej

aksimoN 17 Maj 2012 12:00 1571 22
  • #1 17 Maj 2012 12:00
    aksimoN
    Poziom 10  

    Witam,
    mam taką sytuacje, posiadam tabele:

    [OK].[DEC](
    [NR] [char](6) NULL,
    [ROK] [int] NULL,
    [MC] [int] NULL,
    [OKRES] [datetime] NULL,
    [ILE] [int] NULL,
    [KWOTAA] [decimal](15, 2) NULL,
    [KWOTAB] [decimal](15, 2) NULL,
    [RODZAJ] [char](1) NULL,
    )

    oraz
    [OK].[DEC1](
    [NR] [char](6) NULL,
    [ROK] [int] NULL,
    [MC] [int] NULL,
    [OKRES] [datetime] NULL,
    [ILE] [int] NULL,
    [A] [decimal](15, 2) NULL,
    [B1] [decimal](15, 2) NULL,
    [B2 [decimal](15, 2) NULL,
    )

    chodzi o to żeby rekordy z tabeli DEC mają zostały przepisane do tabeli DEC1 w taki sposób aby wszystkie rekordy w których NR, ROK, MC, OKRES, są takie same są wpisywane w jeden rekord tabeli DEC1 w taki sposób że:

    - wartości z NR,RO,MC,OKRES,ILE są przepisywane, A jest sumą wartości z pól KWOTAA,
    - a pola B1 lub B2 są wypełniane wartością KWOTAB w zależności od tego co znajduje się w polu RODZAJ (gdy tam jest a wypełniamy B1 gdy tam jest b wypelniamy B2 itd...)

    chodzi o to żeby np. 2 rekordy z tabeli DEC zostały wpisane jako jeden rekord tabeli DEC1 tak aby wartość A była sumą wartości pól KWOTAA tych 2 rekordów,
    a wartość KWOTAB była wpisywana do pola B1 gdy RODZAJ='a' i do pola B2 gdy RODZAJ='b' zawsze jest tylko jeden rodzaj danego rekordu w tabeli DEC, w sensie dla takich samych wartości NE,ROK,MC,OKRES jest tylko jeden rekord rodzaju a i jeden rekord rodzaju b

    ps. wyobrażam to sobie tak iż wiersze z tabeli DEC są odpowiednio INSERT'owane do tabeli DEC1 lecz gdy w tabeli DEC1 jest już wiersz za takimi samymi wartościami NR,ROK,MC,OKRES jak w wierszu z DEC to robimy odpowiedniego UPDATE'a

    0 22
  • #2 17 Maj 2012 12:24
    roofy_1
    Poziom 16  

    a co jeśli w tabeli "dec" są takie rekordy których nie ma w tabeli "dec1"?

    0
  • #3 17 Maj 2012 12:28
    aksimoN
    Poziom 10  

    tabela DEC1 na początku jest pusta...
    biore pierwszy wiersz ze DEC i sprawdzam czy w DEC1 jest jakiś wiersz ktory ma taki sam NR,ROK,MC,OKRES jesli jest to go update'uje odpowiednio jeśli nie ma to go insert'uje

    0
  • #4 17 Maj 2012 12:47
    roofy_1
    Poziom 16  

    a już chyba wiem o co Ci chodzi :)
    Zwyczajnie musisz zrobić selecta w tabeli DEC gdzie zgrupujesz sobie po tych polach związanych z datą i zsumujesz [KWOTAA] i dalej wypiszesz warunki w których również zsumujesz sobie wartości w zależności od wartości w polu rodzaj do pola [KWOTAB] .
    Dalej p oprostu robisz "insert into tabela dec1" wyniki tego "selecta" i tyle :)

    0
  • #5 17 Maj 2012 12:53
    aksimoN
    Poziom 10  

    no właśnie nie umiem ich zgrupować i jednocześnie sumować... może jakaś ciekawa stronka w której się tego naucze?

    0
  • #6 17 Maj 2012 12:59
    roofy_1
    Poziom 16  

    dobra już Ci napiszę to :) chociaż wolałbym żebyś to sam zrobił :)

    Kod: sql
    Zaloguj się, aby zobaczyć kod

    0
  • #7 17 Maj 2012 13:31
    aksimoN
    Poziom 10  

    Incorrect syntax near ')'.

    nie wiem o co cho... ilość nawiasów się zgadza.. może gdzieś jakiegoś brakuje?

    0
  • #9 17 Maj 2012 14:16
    aksimoN
    Poziom 10  

    jest jeszcze jeden mały problem, ponieważ chodziło mi o "zespolenie" wierszy, czyli z 2óch powstaje jeden

    0
  • #10 17 Maj 2012 14:23
    roofy_1
    Poziom 16  

    no i tak teraz jest
    jeśli masz dane gdzie kolejne wiersze w polach [NR],[ROK],[MC],[OKRES],[RODZAJ],[ILE] nie różnią się między sobą to pole [kwotaa] się zsumuje i z dwóch i więcej robi się jeden z sumą

    Podaj jak możesz jakieś przykładowe dane to wtedy zobaczymy co z tego można zrobić

    0
  • #11 17 Maj 2012 14:38
    aksimoN
    Poziom 10  

    no tak ale tylko dla tych z tym samym rodzajem, a mi chodziło o to iż np. mam takie 2 wiersze w tabeli DEC

    |NR|ROK |MC |OKRES |ILE|KWOTAA|KWOTAB|RODZAJ|
    | 1 | 2010 | 10 | 2010-01-01 | 2 | 2,25 | 3,15 | a |
    | 1 | 2010 | 10 | 2010-01-01 | 2 | 1,25 | 2,35 | b |

    to z nich otrzymam taki jeden wiersz w DEC1
    |NR|ROK |MC |OKRES |ILE | A | B1 | B2 |
    | 1 | 2010 | 10 | 2010-01-01 | 2 |3,5 |3,15|2,35|

    0
  • #12 17 Maj 2012 15:06
    roofy_1
    Poziom 16  

    tak na szybko:)
    zobacz czy to będzie pasowało do Twoich danych

    Kod: sql
    Zaloguj się, aby zobaczyć kod


    jeśli jednak pojawią się więcej niż dwie wartości z danego rodzaju z tych samych dat, okresów...itp to poprostu w każdym "left joinie" je zgrupuj i zsumuj i dopiero potem wyświetlaj

    0
  • #13 17 Maj 2012 15:15
    aksimoN
    Poziom 10  

    teraz jest ok... teraz tylko takie zespolenie zainsertuje do tabeli i będzie git

    0
  • Pomocny post
    #14 17 Maj 2012 15:18
    roofy_1
    Poziom 16  

    yes

    ps. ps już wyrzuciłem ;)
    ... a bo trzy rzeczy na raz robię

    możesz tez to z posta wyrzucić?

    dzięki :)

    0
  • #15 23 Maj 2012 09:27
    aksimoN
    Poziom 10  

    to jeszcze pytanie na szybko:
    mając tabelę

    Kod: text
    Zaloguj się, aby zobaczyć kod

    ???
    pomijam akcję iż jest tam
    SUM([KWOTAA]) [KWOTAA]
    oraz SUM([KWOTAB]) [KWOTAB]
    chodzi mi o jakąś operację na wierszach umożliwiającą podzielenie przez siebie wartości z 2 kolumn i wpisanie ich do trzeciej???! doszedłem tylko do tego iż mnożenie można zrobić tak:

    iloczyn liczb to inaczej exp(suma logarytmów liczb),
    SELECT exp(sum(log(kolumna)))
    FROM tabela

    a co z dzieleniem? to samo tylko z potęgami do -1 idzie to jakoś łatwiej czy musze pisać skrypt wyliczający i wprowadzający wynik do tabeli ?

    0
  • #16 23 Maj 2012 10:08
    roofy_1
    Poziom 16  

    Najpierw popraw posta w znaczniki kodów :)
    Każde działanie arytmetyczne możesz wykonać za pomocą operatorów arytmetycznych dokładnie jak to napisałeś [KWOTAA]/[KWOTAB] as [WynikDzielenia].
    Sprawdź w pisząc zapytanie, zobacz co Ci wyjdzie. Przecież jak coś źle wyjdzie to sql Ci "w mordę nie da" :)

    0
  • #17 23 Maj 2012 10:25
    aksimoN
    Poziom 10  

    a jednak zadziałało tylko teraz problem z dzieleniem przez 0 jak to jakoś uwarunkować tak iż jeśli trafia na dzielenie przez 0 to wynik ma wpisać 0??

    ps. wcześniej próbowałem tak jak opisałem wyżej i "dostałem w ryj" nie wiem co spieprzyłem może właśnie to iż w widoku w którym tego użyłem 2 kolumny których dzielenie chciałem zrobić były w postaci SUM()

    0
  • #18 23 Maj 2012 10:28
    roofy_1
    Poziom 16  

    :)
    a widzisz krok po kroku...
    Żeby uwzględnić warunek "selera" najprościej jest zrobić coś takiego:

    Kod: sql
    Zaloguj się, aby zobaczyć kod


    Cytat:

    ps. wcześniej próbowałem tak jak opisałem wyżej i "dostałem w ryj" nie wiem co spieprzyłem może właśnie to iż w widoku w którym tego użyłem 2 kolumny których dzielenie chciałem zrobić były w postaci SUM()


    pytanie jaki był błąd? czy pojawiały się wartości czy nie?

    0
  • #19 23 Maj 2012 10:57
    aksimoN
    Poziom 10  

    dobra mam to chyba heheh... w "group by" brakowało nazw tych tabel... teraz poradziłem sobie jeszcze z dzieleniem przez zero, ale wyszło na to że nie mogę zespolić wierszy i równocześnie przeliczyć/wyliczyć wartości dla jednej z kolumn tak więc zrobie sobie jakąś tabelę tymczasową albo coś :P

    0
  • #20 23 Maj 2012 11:41
    roofy_1
    Poziom 16  

    to zrób podzapytanie. Najpierw wyświetl sobie wartości a potem w select wyżej je podziel

    0
  • #21 23 Maj 2012 12:42
    aksimoN
    Poziom 10  

    Dobra ostatnie pytanie :P
    mam
    [KWOTAA]/[KWOTAB] AS [WYNIK] i jeśli wynik jest mniejszy od zera to pokazuje zero
    jak zadeklarować aby wynik pokazywał jako decimal(18,2) skoro pola [KWOTAA] i [KWOTAB] są takiego właśnie typu??

    0
  • #22 23 Maj 2012 13:37
    roofy_1
    Poziom 16  

    zobacz czy tak pójdzie

    Kod: sql
    Zaloguj się, aby zobaczyć kod

    0
  • #23 23 Maj 2012 14:08
    aksimoN
    Poziom 10  

    porzadziłem sobie troche inaczej... okazało się iż KWOTAA i KWOTAB były jako int więc zamieniłem je na decimal i wynik z ich dzielenia tez wyświetla się jako decimal(18, 2)

    0