Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Vytvoreni sloupce dle jmena v jine tabulce

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Vytvoreni sloupce dle jmena v jine tabulce

Autor: VladislavK

16:13:19 05.09.2011

'Compound' 'Origin' 'cmListID' 'OEB' 'CAS' 'MSDS' 'Name' 'OEL'
'bortezomid' '' '1' '<1 ; 1000-500' '179324-69-7' '' 'IUPAC' ''
'bosentant' '' '2' '100-100' '157212-55-0 147536-97-8' 'SA' 'sss' '30'

Citovat příspěvek

 

Re: Vytvoreni sloupce dle jmena v jine tabulce

Autor: VladislavK

16:10:24 05.09.2011

jeste pridam vystup zobrazeny v SQL Server Mangment studio

Compound Origin cmListID OEB CAS MSDS Name OEL
bortezomid 1 <1 ; 1000-500 179324-69-7 IUPAC
bosentant 2 100-100 157212-55-0 147536-97-8 SA sss 30

Citovat příspěvek

 

Re: Vytvoreni sloupce dle jmena v jine tabulce

Autor: VladislavK

15:35:18 05.09.2011

mozna ze to vypada jako blbost ale ja ten vystup takto potrebuji
tady je kod ktery jsem doslova vypotil asi za 3 dny, moc me nekamenujte protoze ja fakt nejsem DTB SPECIALIST ale muzete mi poradit jak vystup z tabulky (cmList_temp), u ktery se bude s kazdym volanim menit struktura jak ji dostat do EF (EntityFrameworku)


[code]

CREATE PROCEDURE [dbo].[CreateMoleculeDataList]

AS
BEGIN
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'cmList_temp')
drop table cmList_temp;

DECLARE @createTable NVARCHAR(MAX)='create table cmList_temp (Compound nVarChar(MAX), Origin nVarChar(MAX), cmListID int,';
DECLARE @col nVARCHAR(MAX);
-- sloupce typu list
DECLARE _l CURSOR FOR (SELECT DISTINCT ml.[Column name List] FROM vw_MoleculeLists as ml);
OPEN _l;
FETCH NEXT FROM _l INTO @col;
WHILE @@fetch_Status=0
BEGIN
SET @createTable=@createTable+@col+' nVarChar(MAX),';
FETCH NEXT FROM _l INTO @col;
END;
CLOSE _l;
-- sloupce typu text
DECLARE _t CURSOR FOR (SELECT DISTINCT ml.[Column name texts] FROM vw_MoleculeLists as ml);
OPEN _t;
FETCH NEXT FROM _t INTO @col;
WHILE @@fetch_Status=0
BEGIN
SET @createTable=@createTable+@col+' nVarChar(MAX)';
FETCH NEXT FROM _t INTO @col;
IF(@@FETCH_STATUS <> 0)
BEGIN
SET @createTable=@createTable+
'CONSTRAINT [PK_cmList_temp] PRIMARY KEY CLUSTERED (
[cmListID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
);';
END
ELSE
BEGIN
SET @createTable=@createTable+','
END
END;
CLOSE _t;
EXECUTE (@createTable);
-- vyrobime data
DECLARE @insertTable NVARCHAR(MAX)='insert into cmList_temp ';
DECLARE @insertCols NVARCHAR(MAX)='(Compound, Origin, cmListID,';
DECLARE @insertData NVARCHAR(MAX)='Empty';
DECLARE @moleculeId INT;
DECLARE @compound NVARCHAR(MAX)='';
DECLARE @origin NVARCHAR(MAX)='';
-- MoleculeDataId,Compound,ISNULL(Origin,' ')
DECLARE _d CURSOR FOR (SELECT DISTINCT ml.[MoleculeDataId] FROM vw_MoleculeLists as ml);
OPEN _d;
FETCH NEXT FROM _d INTO @moleculeId;--,@compound,@origin
WHILE @@fetch_Status=0
BEGIN
DECLARE @vol NVARCHAR(MAX);
-- list hodnoty
OPEN _l;
FETCH NEXT FROM _l INTO @col;
WHILE @@fetch_Status=0
BEGIN
SET @insertCols=@insertCols+@col+',';
DECLARE _did CURSOR FOR (SELECT DISTINCT(ml.[Value of List]),compound,ISNULL(Origin,' ') FROM HSE.dbo.vw_MoleculeLists as ml WHERE ml.MoleculeDataId=@moleculeId and ml.[Column name List]=@col);
OPEN _did;
FETCH NEXT FROM _did INTO @vol,@compound,@origin
if(@@FETCH_STATUS<> -1)
BEGIN
if(@insertData='Empty')
SET @insertData='('''+@compound+''','''+@origin+''','+CONVERT(varchar,@moleculeId)+',''';
WHILE @@FETCH_STATUS=0
BEGIN
SET @insertData=@insertData+@vol+' ; ';
FETCH NEXT FROM _did INTO @vol,@compound,@origin
END;
SET @insertData=SUBSTRING(@insertData,1,LEN(@insertData)-3);
END;
ELSE
SET @insertData=@insertData+'''';

CLOSE _did;
DEALLOCATE _did;
SET @insertData=@insertData+''',';
FETCH NEXT FROM _l INTO @col;
END;
CLOSE _l;
-- end list hodnoty
-- textove hodnoty
SET @insertData=@insertData+'''';
OPEN _t;
FETCH NEXT FROM _t INTO @col;
WHILE @@fetch_Status=0
BEGIN
SET @insertCols=@insertCols+@col+',';
DECLARE _did CURSOR FOR (SELECT DISTINCT(ml.[Value of Texts]) FROM HSE.dbo.vw_MoleculeLists as ml WHERE ml.MoleculeDataId=@moleculeId and ml.[Column name texts]=@col);
OPEN _did;
FETCH NEXT FROM _did INTO @vol
if(@@FETCH_STATUS<> -1)
BEGIN
WHILE @@FETCH_STATUS=0
BEGIN
SET @insertData=@insertData+@vol+' ; ';
FETCH NEXT FROM _did INTO @vol
END;
SET @insertData=SUBSTRING(@insertData,1,LEN(@insertData)-2)+''',''';
END;
--ELSE
-- SET @insertData=@insertData+'''';

CLOSE _did;
DEALLOCATE _did;
--SET @insertData=@insertData+''',';
FETCH NEXT FROM _t INTO @col;
END;
CLOSE _t;
-- end text hodnoty
SET @insertCols=SUBSTRING(@insertCols,1,LEN(@insertCols)-1)+') VALUES ';
SET @insertData=SUBSTRING(@insertData,1,LEN(@insertData)-2)+')';
SET @insertTable=@insertTable+@insertCols+@insertData;
EXECUTE (@insertTable);
SET @insertTable='insert into cmList_temp ';
SET @insertCols='(Compound, Origin, cmListID,';
Set @insertData='Empty';
FETCH NEXT FROM _d INTO @moleculeId;--,@compound,@origin
END;
CLOSE _d;
END

[/code]

Jako vstupni data potrebujete cca nasledujici

'MoleculeDataId' 'Compound' 'Origin' 'Column name texts' 'Unit' 'Value of Texts' 'Column name List' 'Value of List'
1 'bortezomid' NULL 'OEL' 'µg/m3' '' 'OEB' '1000-5000'
1 'bortezomid' NULL 'OEL' 'µg/m3' '' 'OEB' '<1'
2 'bosentant' NULL 'OEL' 'µg/m3' '30' 'OEB' '100-1000'
1 'bortezomid' NULL 'CAS' '' '179324-69-7' 'OEB' '1000-5000'
1 'bortezomid' NULL 'CAS' '' '179324-69-7' 'OEB' '<1'
2 'bosentant' NULL 'CAS' '' '157212-55-0 147536-97-8' 'OEB' '100-1000'
1 'bortezomid' NULL 'MSDS' '' '' 'OEB' '1000-5000'
1 'bortezomid' NULL 'MSDS' '' '' 'OEB' '<1'
2 'bosentant' NULL 'MSDS' '' 'SA' 'OEB' '100-1000'
1 'bortezomid' NULL 'Name' 'IUPAC' 'IUPAC' 'OEB' '1000-5000'
1 'bortezomid' NULL 'Name' 'IUPAC' 'IUPAC' 'OEB' '<1'
2 'bosentant' NULL 'Name' 'IUPAC' 'sss' 'OEB' '100-1000'

a vystupni data jsou ulozena prave ve vyse uvedene tabulce

Citovat příspěvek

 

Re: Vytvoreni sloupce dle jmena v jine tabulce

Autor: P

15:00:49 05.09.2011

VladislavK Napsal:
-------------------------------------------------------
> ktery bude mit tolik sloupcu kolik jich je uvedeno
> ve zdroji ve sloupci Key a to konkretni jmeno toho
> sloupce bude vytvoreno jedenkrát z hodnoty ve
> zdroji a hodnota toho sloupce na vystupu bude
> mnozina všech hodnot odpovidajici jmenu sloupci na
> vstupu
>

To mne prijde jako pekna blbost. Co budes delat s retezci poskladanymi ze vsech jmen, veku atd.? Kdyz bude mit tabulka milion radku, tak bude ve sloupci milion spojenych jmen?
Spis bych chapal potrebu vystupu ve tvaru
[code]
ID Jmeno Prijmeni Vek Aktivni Deti
----------------------------------
1 Vlada Kral 18 NULL 2
2 Petr Slavik 21 NULL NULL
3 Jana Novakova 32 true 1
[/code]
Na to je operator PIVOT.

Citovat příspěvek

 

Re: Vytvoreni sloupce dle jmena v jine tabulce

Autor: VladislavK

15:56:49 02.09.2011

jedna se MSSQL 2008 R2 ale fakt je ze provozovat se to bude na 2005

dodam nejake upresneni

studiem jsem nasel cca navod a to ze

1)prostrednictvim Distinct vyzvednu seznam sloupcu z techto napisu

2)create temporery aaa(slp1(char100),.....

3)do te toto table provedu insert jednoho radku ktery nakonec vyselektuju

problem je v tom ze nejsem DTB specialist a nevim cim zacina a konci konci view asi do toho bude vlozena procedura (procedure vim pouze to ze existuje)

4)beznym selectem do aaa si prenesu data do netu kde uz s tim budu moct pracovat

dodam upresnujici tvar vstupnich a vystupnich dat

dik za kazdou pomoc


Takze zdrojova tbl

ID ktere logicky svazuje vety Key Value
1 Jmeno “Vlada”
3 Deti 1
1 Prijmeni “Kral”
1 Vek 18
2 Prijmeni “Slavik”
2 Vek 21
1 Deti 2
2 Jmeno “Petr”
3 Aktivni true
3 Vek 32
3 Jmeno “Jana”
3 Prijmeni “Novakova”

Vystup

Nazvy sloupcu Jmeno Prijmeni Vek Aktivni Deti
Vlada; Petr; Jana Kral; Slavik; Novakova 18; 21;32 null(false); null(false); true 2; (null)nula; 1;


Je to srozumitelne?
proste jde o to jak na vystupu vytvorit objekt ktery bude mit tolik sloupcu kolik jich je uvedeno ve zdroji ve sloupci Key a to konkretni jmeno toho sloupce bude vytvoreno jedenkrát z hodnoty ve zdroji a hodnota toho sloupce na vystupu bude mnozina všech hodnot odpovidajici jmenu sloupci na vstupu

Citovat příspěvek

 

Re: Vytvoreni sloupce dle jmena v jine tabulce

Autor: grafnev

12:18:14 02.09.2011

Jo na to je proc transpose:

http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a000063663.htm

:).

Citovat příspěvek

 

Re: Vytvoreni sloupce dle jmena v jine tabulce

Autor: P

12:04:40 02.09.2011

Nepomuzu, protoze jsi nenapsal o jakou jde DB.
Uz to tu bylo zmineno tolikrat, ze by to asi chtelo zacit lemplovske dotazy trestat.

Citovat příspěvek

 

Vytvoreni sloupce dle jmena v jine tabulce

Autor: VladislavK

11:14:34 02.09.2011

Ahoj potreboval nejlepe view ktere by mi vratilo data v nasledujicim tvaru

priklad vstupnich dat
Jmeno, Hodnota
Slp1, 10
Slp2, 11.0
Slp1, 5
Slp3, "ahoj"
Slp2, 12.235
Slp3, "svete"
Slp4, true


vystupni data

Slp1 Slp2 Slp3 Slp4
10, 11.0, "ahoj", true
5, 12.345, "svete", null

proste jde o to jak na vystupu vytvorit objekt ktery bude mit tolik sloupcu kolik jich je uvedeno ve zdroji ve sloupci jmeno a to konkretni jmeno sloupce bude vytvoreno z hodnoty na konkretnim radku ve zdroji


pomuze nekdo dik za kazdou radu

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: