Jump to content

SQL jautājums - Atrisināts. Risinājums iekļauts.


kazarma
 Share

Recommended Posts

Labdien,

 

ir divi vaicājumi:

 

1.select model,mb from MyPC where mb is not null
2.select model,ram from  MyPC where ram is not null
 
kuri atgriež :
 
1
 
model mb
x         v
x         b
        
 
2
 
model ram
x          q
        
        
 
Vajaga šos divus vaicājumus apvienot vienā outputā:
 
model mb ram
x          v    q
x          b
   
 
Kāds var izlīdzēt? :)
 
UPDATE
 

Piemērs no oriģinālās tabulas:

 

  model  MB     RAM     CPU ...

1  x        NULL  NULL     b

2  x        y         NULL     NULL

3  x        NULL  c            NULL

4  x        NULL  c            NULL

5  x        NULL  c            NULL

 

Vajadzīgais rezultāts:

 

  model  MB     RAM     CPU ...

1  x        y            c          b

2  x                      c 

3  x                      c     

 

Links uz bildi http://failiem.lv/g/...#aa/Capture.JPG

Links uz rezultāta bildi http://failiem.lv/u/miivqvb

post-57778-0-52592700-1413361546_thumb.jpg

Labots - kazarma
Link to comment
Share on other sites

select model, mb, ram from MyPC where mb is not null and ram is not null

Labots - Salmo
Link to comment
Share on other sites

Neder, jo ir ieraksti kuros ram ir pilns un mb ir tukš un otrādi.

 

@Salmo

izmantojot tavu vaicājumu tiek atgrieztas 3 tukšas kolonnas.

 

Reāli vajaga apvienot augstāk minēto vaicājumu outputus ar kaut kādu temp tabulu? Inner/outer join?

 

Reāli nav tik daudz pieredzes ar SQL, lai zinātu kas vispār ir iespējams.

Labots - kazarma
Link to comment
Share on other sites

@Ju

 

Arī ar or neder, jo mērķis ir likvidēt NULL ierakstus.

 

Tavā gadījumā man tiek atgriezta tā pati tabula ar NULL ierakstiem.

 

Piemērs no oriģinālās tabulas:

 

  model  MB     RAM     CPU ...

1  x        NULL  NULL     b

2  x        y         NULL     NULL

3  x        NULL  c            NULL

4  x        NULL  c            NULL

5  x        NULL  c            NULL

 

Vajadzīgais rezultāts:

 

  model  MB     RAM     CPU ...

1  x        y            c          b

2  x                      c 

3  x                      c            

Labots - kazarma
Link to comment
Share on other sites

Mezavecis

Rezultāts ir kaut kas nesaprotams. Nu nevar izveidot tādu ierakstu, kuram MB = y, RAM = c un CPU = b ar konkrēto modeli x, jo oriģinālā tabulā tāda ieraksta nav.  Jāsaprot, ka atlasīt ierakstus nav tas pats, kas uzģenerēt tabulu pēc ierakstu satura.

Link to comment
Share on other sites

Noteikti, kad var, jo:

 

1.select model,mb from MyPC where mb is not null
2.select model,ram from  MyPC where ram is not null

 

atgriež :

 

model mb
x         v
        
       
model ram
x        q
x        a
      

 

Loģiski ir jāvar šos outputus apvienot radot vajadzīgo rezultātu.

 
model mb ram
x         v      q
x                 a
Labots - kazarma
Link to comment
Share on other sites

Ja negribi redzēt NULL ierakstus tukšajās cellēs, maini iestatījumus pašā datu bāzē/tās klientā.


ā pareizi, tur vēl pēc kaut kādas mistiskas grupēšanas izskatās

tad vajag saprast, pēc kā grupēt

Link to comment
Share on other sites

Iedod lūdzu datus, kur x vietā ir kas normāls, lai tavi piemēri liktos jēdzīgāki.

Un vēl, kas par DB? MySQL vai Oracle, vai vēl kāda cita?

Labots - itanium
Link to comment
Share on other sites

Mezavecis

Kas ir x? Ja tas ir unikāls skaitlis vai virkne, tad neko tur sagrupēt nevarēs. Tas ko tu vēlies, nav ierakstu likvidēšana, bet jaunas tabulas izveide. Ieraksts SQL izpratnē ir rinda nevis viena šūna. 

Link to comment
Share on other sites

Pievienoju attēlu, kā izskatās outputs - kāpēc sanāca tik mazs atttēls nezinu.  


@Mezavecis

x nav unikāls - mēģini acis pamežģīt pie pievienotā attēla varbūt tur būs tev skaidrība.

Link to comment
Share on other sites

Ieliec augstākas kvalitātes attēlu, a to nevar saprast vai dažas šūnas atšķiras vai nē.

Link to comment
Share on other sites

Tev vienam un tam pašam modelim ir četri dažādi RAM un divi dažādi CD-ROM. Kādu tu esi iedomājies atlases vaicājuma rezultātu uz reāliem datiem?

Labots - itanium
Link to comment
Share on other sites

Es nevaru saprast, ko var burties.

 

Es zinu, ka vienā select nevar dabūt to ko vajaga.

Tāpēc sīki un smalki aprakstīju KO man vajaga.

 

Man vajaga apvienot DIVU dažādu select OUTPUTUS, tas arī viss.

 

Tiem, kas visu nelasa atkārtošu velreiz:

 

1.select model,mb from MyPC where mb is not null
2.select model,ram from  MyPC where ram is not null
 
kuri atgriež :
 
KOREKTS OUTPUTS TIEŠI TAS KO VAJAGA!
1
model mb
x         v
x         b
 
KOREKTS OUTPUTS TIEŠI TAS KO VAJAGA!       
2
model ram
x          q
        
Vajaga šos divus vaicājumu outputus apvienot vienā outputā:
 
model mb ram
x          v    q
x          b
 
Teorētiski var pat teikt, ka pie pirmā outputa ir brutāli jāpielīmē klāt kolonna RAM no otrā outputa. 
Secība nav svarīga. Svarīgi ir tikai (skatīties bildi) likvidēt tukšos kollonu ierakstus. 
Labots - kazarma
Link to comment
Share on other sites

Un tagad ar reāliem datiem parādi, kāds ir sagaidāmais rezultāts ;)

Savādāk liekas, ka kaut ko tomēr neesi līdz galam izdomājis.

Labots - itanium
Link to comment
Share on other sites

Tev katra kolonna domāta kā unikālo katras kolonnas ierakstu saraksts?

 

 

model mb ram
x        null  null
x          v   null
x        null null
x          b  null
x       null   q
 
Tev vajag lai ne null vērtības katrā kolonnā "pabīdās" uz augšu?
 
model mb ram
x          v   q
x          b  
Labots - Salmo
Link to comment
Share on other sites

@Salmo

Ja pareizi tevi sapratu, tad atbilde ir jā.

 

@itanium

 

Kas ir tagad izmantojot vaicājumu : Select * from mypc where model='OptiPlex 7010 6NZYH5J' 

http://failiem.lv/g/hjgffen#aa/Capture.JPG

 

Kas ir vajadzīgs izmantojot vēl nezināmu vaicājumu

http://failiem.lv/u/miivqvb

 

Svarīgi ir saprast, ka kollona Model ir izmantotā kā unikālais ID pēc kura es datus atlasu , pēc tam tie ir jāparveido lai atbilst pārskatāmam output attēlam.

Savādāk kā var redzēt nemodificētā attēlā, kas ir brutāls "Select * from mypc where model='OptiPlex 7010 6NZYH5J' " outputs ir nepārskatāma informācija.

 

Ieraksti par jauniem PC tiks pievienoti klāt šai pašai tabulai un pirmatnējā select mainīsies tikai X sadaļa "Select * from mypc where model='X'  "

Labots - kazarma
Link to comment
Share on other sites

versatile

nu bet tad tā arī dari

slinkums rakstīt, bet atlasi visu rzultātu kopu no to divu 2-kolonnu tabulu full joina pēc modeļa.

Vai, ja nav vispār pēc kā sasaistīt, tad raksti selectu no trim tabulām, kurā katrā ir distinct selects pēc katras no vērtībām. Dabūsi visas kombinācijas.

Link to comment
Share on other sites

@Versatile

Pilnīgi neko nesapratu :)

 

Es māku uzrakstīt parastu select bet parējais tavs teksts man ir kā ķīniešu ābece. Ja nav reāla piemēra es tālāk nekur netikšu.

 

Tas ko es domāju :

 

1)

Atlasa datus pēc vaicājuma: "Select * from mypc where model='X' un ievieto tos kaut kāda temp tabulā.

2)

select model,mb from MyPC where mb is not null

select model,ram from  MyPC where ram is not null
utt
un ievieto tos katru savā temp tabulā.
3)
Vaicājums no otrā punkta pirmajai temp tabulai pievienot otrās tabulas kollonu trešās temp tabulas kollonu utt.
4)
Parāda gala temp tabulu
 
BET nav vajadzīgo zināšanu, lai šo uzrasktītu, tāpēc griežos šeit pēc palīdzības. 
Labots - kazarma
Link to comment
Share on other sites

versatile

Vispār, ir labs teiciens,a ttiecībā uz datiem un analītiku - shit in, shit out.


ok, mēģinam tā.

Select a.*, b.* from (select model, ram from tabula) a inner join (select model, mb from tabula) b on a.model = b.model where a.model = 'figņaflex'

joinu varbūt vajag full

 

Nesaku, ka viss korekti, bet nu šitāda ideja neder?

Labots - versatile
Link to comment
Share on other sites

Nezinu pamēģināšu :)

 

Pamēģināju - NULL ieraksti saglabājas.

 

Galarezultāts tāds pats itkā būtu veikts parasts select * from mypc where model='figņaflex' tikai protams paliek trīs kollonas model ram un MB

 

Īstenībā Model kollona ir 2x , bet tas neko nemaina.

 

Vari lūdzu uzrakstīt kodu kā vieni tabulai pielipināt brutāli kollonu no otras tabulas?

Labots - kazarma
Link to comment
Share on other sites

Skurstenis

Kaut kā tā:

 

Tabula:

create table TMP_MPC (model varchar(32), mb varchar(32), ram varchar(32), cpu varchar(32));

 

Dati:

insert into TMP_MPC values ('x', null, null, 'b');
insert into TMP_MPC values ('x', 'v', null, null);
insert into TMP_MPC values ('x', 'b', null, null);
insert into TMP_MPC values ('x', null, 'q', null);
insert into TMP_MPC values ('x', null, 'z', null);
insert into TMP_MPC values ('x', null, null, null);
 

Selects:

-- tie, kam ir gan mb, gan ram
select unique model, mb, ram from TMP_MPC
 where mb is not null
 and ram is not null
 and model = 'x'
union all
select mbs.model, mbs.mb, rams.ram from
 -- ir mb, nav ram
(select unique model, mb, ram
 from TMP_MPC
 where mb is not null
 and ram is null
 and model = 'x') mbs,
 -- ir ram, nav mb
(select unique model, mb, ram
 from TMP_MPC
 where mb is null
 and ram is not null
 and model = 'x') rams
;
 

Rezultāts:

MODEL  MB  RAM                              
-----  --- ----
x       v     q
x       v     z
x       b     q
x       b     z    
 

, tikai nav gluži tas, ko  vajadzēja, jo te būs visas kombinācijas no mb un ram-iem :)

Link to comment
Share on other sites

Neasprotu, kapēc šādi:

model mb ram
x          v    q
x          b   
 

A ne šādi:

model mb ram
x          v    q
x          b    q
Labots - camel
Link to comment
Share on other sites

Skurstenis

Gandrīz tas, ko vajag:

select mdl.model, mbs.mb, rams.ram
from
(select row_number() OVER (ORDER BY model) AS rnum, model from TMP_MPC
 where not (ram is null and mb is null)) mdl,
(select row_number() OVER (ORDER BY ram) AS rnum, model, ram from TMP_MPC) rams,
(select row_number() OVER (ORDER BY mb) AS rnum, model, mb from TMP_MPC) mbs
where mdl.rnum = rams.rnum
and rams.rnum = mbs.rnum
and mdl.model = 'x'
;

 

Izveidojam 3 kopas, ar vienādu ierakstu skaitu, pēdējās divas sakārtotas attiecīgi pēc ram un mb.

Pēc tam ņemam pirmo kopu un pielasam klāt no pēdējām divām kopām ierakstu ar to pašu kārtas numuru.

 

Kas ne gluži tā:

1. Rezultātā ir viena lieka rindiņa:

  'x' null, null

2. Ja vispār nav neviena ram-a un neviena mb-a, tad rezultāta nebūs, bet tad tieši vajadzētu būt tam 'x' null null

Link to comment
Share on other sites

Ja kādam interesē rekur ir gala risinājums, lai dabūtu vēlamo outputu:

 

Tāda sajūta ko šodien būšu apguvis diezgan daudz SQL.....

with
Model AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY Model) AS RowNumber,
           Model
      FROM mypc
     WHERE model IS NOT NULL 
),
MB AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY MB) AS RowNumber,
           MB
      FROM mypc
     WHERE MB IS NOT NULL
),
RAM AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY RAM) AS RowNumber,
           RAM
      FROM mypc
     WHERE RAM IS NOT NULL
),
HDD AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY HDD) AS RowNumber,
           HDD
      FROM mypc
     WHERE HDD IS NOT NULL
),
CPU AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY CPU) AS RowNumber,
           CPU
      FROM mypc
     WHERE CPU IS NOT NULL
),
CDROM AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY CDROM) AS RowNumber,
           CDROM
      FROM mypc
     WHERE CDROM IS NOT NULL
),
GPU AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY GPU) AS RowNumber,
           GPU
      FROM mypc
     WHERE GPU IS NOT NULL
),
LAN AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY LAN) AS RowNumber,
           LAN
      FROM mypc
     WHERE LAN IS NOT NULL
)
 
SELECT model,mb,ram,hdd,cpu,cdrom,gpu,lan
  FROM Model
  LEFT JOIN MB
    ON Model.RowNumber = MB.RowNumber
  LEFT JOIN RAM
    ON Model.RowNumber = RAM.RowNumber
	LEFT JOIN hdd
    ON Model.RowNumber = hdd.RowNumber
	LEFT JOIN cpu
    ON Model.RowNumber = cpu.RowNumber
	LEFT JOIN cdrom
    ON Model.RowNumber = cdrom.RowNumber
	LEFT JOIN gpu
    ON Model.RowNumber = gpu.RowNumber
	LEFT JOIN lan
    ON Model.RowNumber = lan.RowNumber
	where mb is not null or ram is not null or hdd is not null or cpu is not null or cdrom is not null or gpu is not null or lan is not null

Labots - kazarma
Link to comment
Share on other sites

Tev skriptā nav vairāk rindu kā datubāzē?

Un jā, es tā arī īsti nesapratu, ko vēlies panākt.

Link to comment
Share on other sites

@Ju

Tev taisnība, pirmo atlasi veic webaplikācija (select * into variable1 from variable2 where model='variable3')

 

Pēc tam jau "mypc" vietā ir attiecīgais "variable2" un notiek tālākā sakārtošana.

 

Pirmajā postā paskaties linkus ar bildēm.

 

1-links kā izskatījās tagad

2-links kā vajaga, lai izskatītos.

Labots - kazarma
Link to comment
Share on other sites

1. Sākotnējās datu struktūras ir kaut kādas dīvainas. Vai ar tām kko var iesākt?

 

2. Izmantot vairākus sql pieprasījumus, lai uzģenerētu vienu skatu nav nekāds kauns.

Link to comment
Share on other sites

  • 3 months later...

Kungi un dāmas!
Palīdziet lūdzu uzrakstīt SQL vaicājumu, kas izgūs dažas kollonas no konkrētas tabulas, bet no visām sql datu bāzēm. Tādas ir daudzas datubāzes, kuās ir viena un tā pati tabula (protams ar citiem datu ierakstiem).

 

Ja vēl rezultātā vienā no kolonām uzrādītos datu bāzes nosaukums, tad pie piektdienas prieks lielais būtu.

Paldies

Link to comment
Share on other sites

Mezavecis

Būtu labi pieminēt, kas tās pa "daudzām datu bāzēm", kādā vidē utt. Pagaidām no esošā apraksta pilnīgi nekādu SQL vaicājumu nevar uzrakstīt. 

Link to comment
Share on other sites

hmm.. SQL server 2008R2

domāju parastu vaicājumu ko palaist sql managament studio.

tā ir datubāze speciālai programmai un daudzas ir tādēļ, ka katram klientam ir sava datu bāze.


Tik tālu pats tiku:

 

Select Code, Bezeichnung, Berichtstyp, PIDatum, PIZeit
from  S_Berichte
where Berichtstyp=15 or Berichtstyp=17
Order by PIZeit DESC
 
Tas ir tikai konkrētai datu bāzei, bet gribās lai atlase notiktu no visām un plus rezultātā lai varētu identificēt no kuras datu bāzes ieraksts ir nācis (respektīvi papildus kollona ar datu bāzes nosaukumu)
Link to comment
Share on other sites

Mezavecis

Vispirms vajag pielinkot kādam serverim visas nepieciešamās datu bāzes un tad rakstīt pieprasījumu. Ja DB atrodas dažādās pasaules malās, tad pieprasījums izpildīsies nežēlīgi lēni, bet ja kāds no serveriem būs offline, tad nekas normāls nesanāks.

 

Te piemērs, kā selektēt datus no vairākām DB.

http://www.sqlteam.com/article/selecting-data-from-different-databases

 

Ieteiktu tomēr salasīto rezultātu no katras DB ievietot katrā savā tabulā,  vienā DB, un tad veidot pieprasījumu, lai cilvēcīgā termiņā varētu apstrādāt datus. 

Link to comment
Share on other sites

Ok, mēģināšu ko darīt. Visas datubāzes atrodas uz viena servers turklāt lokāli. Domāju, ka nevajadzētu būt problēmas ar ātrumu.

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...