BCP i połączenie dwóch kolumn oraz wynik zawsze trzycyfrowy

0

Witam ponownie

W poprzednim poście kolega @woolfik pomógł i poszedłem dalej.
Dodałem nazwy kolumn, zaokragliłem do pełnych liczb, za pomocą BCP udało się całość wyeksportować do pliku TXT.
Do pełni szczęści brakuje mi formatu wyjściowego.

Próbowałem łączyć kolumny za pomocą "CAST" oraz "CONCAT" ale bez powodzenia

Wynik sumy z każdej kolumny (szklenie i jednostki) muszę mieć zawsze trzycyfrowy. Obecnie jak szklenie np. ma wynik 58 i jednostek jest 30 to wynik mam 58 30 – muszę uzyskac aby ten wynik zapisał się do pliku tekstowego w formacie: 058030.

Poniżej kod oraz wynik zapytania:

  SELECT sum(s.glasscnt) AS szklenia, (SELECT ROUND(sum(s.product_time ),0))AS jednostki 
from    
(SELECT  '' as prod_cell_name,                                   
            (SELECT     COUNT(*) AS Expr1  
               FROM          dbo.prod_cell_doc AS pcd
               WHERE      (pcd.prod_cell_id = 101) AND (pcd.product_doc_id = dbo.prod_cell_doc.product_doc_id) AND (pcd.order_number = dbo.prod_cell_doc.order_number))

                      AS glasscnt, product_doc.product_time  
FROM  dbo.prod_cell_doc_event 
   JOIN dbo.prod_cell_status ON dbo.prod_cell_doc_event.prod_cell_status_id = dbo.prod_cell_status.id 
   JOIN dbo.prod_cell_doc ON dbo.prod_cell_doc_event.prod_cell_doc_id = dbo.prod_cell_doc.id 
   JOIN dbo.product_doc ON dbo.prod_cell_doc.product_doc_id = dbo.product_doc.id 
   JOIN dbo.doc ON dbo.product_doc.doc_id = dbo.doc.id   
   JOIN dbo.VUsers ON dbo.prod_cell_doc_event.user_id = dbo.VUsers.ID             
where 1=1 AND prod_cell_doc_event.work_center_id=109 AND prod_cell_doc.prod_cell_id=107 AND prod_cell_doc_event.cd BETWEEN (select TRY_CONVERT(DATE,GETDATE())) AND (select TRY_CONVERT(DATE,(GETDATE()+1)))) s 

Wynik:
wyniksql.JPG

BCP:

bcp "SELECT sum(s.glasscnt) AS szklenia, (SELECT ROUND(sum(s.product_time ),-1))AS jednostki from (SELECT  '' as prod_cell_name, (SELECT COUNT(*) AS Expr1 FROM RedanC.dbo.prod_cell_doc AS pcd WHERE      (pcd.prod_cell_id = 101) AND (pcd.product_doc_id = RedanC.dbo.prod_cell_doc.product_doc_id) AND (pcd.order_number = RedanC.dbo.prod_cell_doc.order_number)) AS glasscnt, product_doc.product_time  FROM  RedanC.dbo.prod_cell_doc_event JOIN RedanC.dbo.prod_cell_status ON RedanC.dbo.prod_cell_doc_event.prod_cell_status_id = RedanC.dbo.prod_cell_status.id JOIN RedanC.dbo.prod_cell_doc ON RedanC.dbo.prod_cell_doc_event.prod_cell_doc_id = RedanC.dbo.prod_cell_doc.id JOIN RedanC.dbo.product_doc ON RedanC.dbo.prod_cell_doc.product_doc_id = RedanC.dbo.product_doc.id JOIN RedanC.dbo.doc ON RedanC.dbo.product_doc.doc_id = RedanC.dbo.doc.id JOIN RedanC.dbo.VUsers ON RedanC.dbo.prod_cell_doc_event.user_id = RedanC.dbo.VUsers.ID where 1=1 AND prod_cell_doc_event.work_center_id=109 AND prod_cell_doc.prod_cell_id=107 AND prod_cell_doc_event.cd BETWEEN (select TRY_CONVERT(DATE,GETDATE())) AND (select TRY_CONVERT(DATE,(GETDATE()+1)))) s " queryout c:\temp\test.txt -c -t -U -T

Wynik:
txt.JPG

Potrzebuje tak:
txt2.JPG
txt3.JPG

Edycja:
Wydaje mi się, że jak kolumny zostaną połączone to ten odstęp pokazany na obrazku wyżej zniknie, ale nie wychodzi mi połączenie tych dwóch kolumn, zbyt złożone zapytanie już się zrobiło...

EDYCJA2:
Już mam wynik który zawsze jest trzycyfrowy. Ponieważ dziś już wyniki powyżej 100 więc w przykładzie pokażę wynik zawsze czterocyfrowy:

SELECT RIGHT('0' +CAST(sum(s.glasscnt)AS VARCHAR(4)),4) AS szklenia, RIGHT('0' +CAST(ROUND (sum(s.product_time),0)AS VARCHAR(4)),4) AS Jednostki
from    
(SELECT  '' as prod_cell_name,                                    
            (SELECT COUNT(*) AS Expr1  
               FROM          dbo.prod_cell_doc AS pcd
               WHERE      (pcd.prod_cell_id = 101) AND (pcd.product_doc_id = dbo.prod_cell_doc.product_doc_id) AND (pcd.order_number = dbo.prod_cell_doc.order_number))

                      AS glasscnt, product_doc.product_time  
FROM  dbo.prod_cell_doc_event 
   JOIN dbo.prod_cell_status ON dbo.prod_cell_doc_event.prod_cell_status_id = dbo.prod_cell_status.id 
   JOIN dbo.prod_cell_doc ON dbo.prod_cell_doc_event.prod_cell_doc_id = dbo.prod_cell_doc.id 
   JOIN dbo.product_doc ON dbo.prod_cell_doc.product_doc_id = dbo.product_doc.id 
   JOIN dbo.doc ON dbo.product_doc.doc_id = dbo.doc.id   
   JOIN dbo.VUsers ON dbo.prod_cell_doc_event.user_id = dbo.VUsers.ID             
where 1=1 AND prod_cell_doc_event.work_center_id=109 AND prod_cell_doc.prod_cell_id=107 AND prod_cell_doc_event.cd BETWEEN (select TRY_CONVERT(DATE,GETDATE())) AND (select TRY_CONVERT(DATE,(GETDATE()+1)))) s 

Wynik:
txt4.JPG

Pozostało tylko scalić te dwie kolumny i jestem w domu. Ktoś coś? :) Podpowie :)

EDYCJA 3:
Jednak mam efekt końcowy jaki chciałem. Zmieniając pierwszą linię aby wynik był zawsze trzycyfrowy (kod powyżej) zapytanie za pomocą BCP zwraca wynik do TXT i nie robi już odstępu między kolumnami mimo tego że jest w dwóch osobnych kolumnach.
Tak czy inaczej fajniej by to wyglądało jak by to było zapisane w jednej kolumnie.

2

Nie napisałeś co to za baza ale po nazwie schematu wnioskuję, ze MSSQL. Jeśli tak to wiodące zero możesz zrobić tak:

SELECT REPLICATE('0',3-LEN(glasscnt)) + glasscnt

od razu mówię, że pisałem z głowy ale mniej więcej uzyskasz takie wyniki:
dla glasscnt = 1 będzie 001 dla glasscnt 10 będzie 010 dla 100 będzie 100

1

Dzięki wam udało się zrealizować projekt. Mamy wymarzony licznik dziennej produkcji :)
Założenie było takie, że leci zapytanie do bazy SQL i baza zwraca wynik z dwóch kolumn w jednym ciągu. Warunek taki że ciąg ten będzie się składał zawsze z 6 cyfr.
Wynik wyświetlany będzie za pomocą Raspberry PI i wyświetlacza 7 segmentowego po SPI.
Wyświetlacze i sterowniki są zazwyczaj na 8 cyfr, ja wykorzystać chciałem pierwszych 6 podzielonych w dwie linie. Myślę że obrazek poniżej wyjaśni wszystko:
LED.png

Finalny wynik wygląda tak:
led1.jpg
led2.jpg
led3.jpg

1 użytkowników online, w tym zalogowanych: 0, gości: 1