Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Dynamisk resultat...

Postades av 2003-08-05 19:34:39 - Fredrik Salomonsson, i forum sql-server/msde, Tråden har 10 Kommentarer och lästs av 816 personer

Hej.

Sitter med ett problem i SQL-Server 2000 som jag inte kan lösa... (frågan går inte tillräckligt snabbt iallafall)

Problemet förenklat:

tblBilar:
id int, märkesid int, däcktypsid int

ex:
1 1 1
2 3 4
3 4 5
4 5 3
osv...

tblBilmärken:
id int, Märke varchar

ex:
1 volvo
2 Saab
3 Opel
4 Ford
osv...

tblDäckTyp
id int, Typ varchar

ex:
1 Traktor
2 Lågprofil
3 Vinter
4 Odubbade
osv...

Hur gör jag för att få ut en tabell liknade denna: (Exempel, stämmer inte med ovan)
Läs den såhär:
"76 Saabar har Lågprofilsdäck"
"3 volvo har Traktordäck"

[Bilmärke] [Antal Traktor] [Antal Lågprofil] [Antal Vinter] [Antal Odubbade]
Saab 99 76 78 21
Volvo 3 3 34 34
Ford 0 24 19 89


Tabellen skall alltså med tiden kunna "växa" både på bredden och på längden...

Det vore himla bra om ni kunde hjälpa mig framåt på nåt vis...



Svara

Sv: Dynamisk resultat...

Postades av 2003-08-05 22:02:59 - Pontus Wång

Själv så skulle jag lösa själva vridningen av resultatet i kod för då kan du slå ihop allt i en enda join, men måste du lösa det i sql så ska du antingen kolla på cursors (slött om det är mycket data som hämtas) eller mssql's olap funktioner för att sammanställa statistik (också rätt så slött vid stora datamängder).


Svara

Sv: Dynamisk resultat...

Postades av 2003-08-05 22:54:03 - Andreas Hillqvist

Kanske något sådant här fungerar?


DECLARE @SQL varchar(1000)
DECLARE @Fields varchar(1000)

SET @Fields = 'tblBilmärken.Märke'

SELECT @Fields = @Fields + ', SUM(CASE tblBilar.DäckTypsId WHEN ' + CAST(tblDäckTyp.ID AS varchar) + ' THEN 1 ELSE 0 END) AS [Antal ' + tblDäckTyp.Typ + ']'
FROM tblDäckTyp

SET @Fields = 'SELECT ' + @Fields + ' FROM tblBilmärken LEFT JOIN tblBilar ON tblBilmärken.id = tblBilar.MärkesId GROUP BY tblBilmärken.Märke'

EXEC @SQL



Har för mig att man använder " tecken istället för AS [ och ]. Så du får ev. ändra det till " tecken om den klagar på det.


Svara

Sv: Dynamisk resultat...

Postades av 2003-08-06 10:07:17 - Fredrik Salomonsson

Hej.

Tackar för att ni tagit er tid...

Min lösning bygger på dynamisk SQL.
Nedan använder jag de rätta tabellnamnen och definitionerna:

tblCase = tblBilar
tblBilmärken = tblSubCat
tblDäckTyp = tblCaseType

Den är seg men den fungerar så här långt. (Mer skall göras...)

<code>
declare @pDateStart varchar(10)
declare @pDateStop varchar(10)

set @pDateStart = '2002-01-01'
set @pDateStop = '2003-02-01'


declare @sql varchar(8000)
declare @sqls varchar(8000)

declare @ct table(ctID int, [ctName] varchar(30))
declare @minid int
declare @ctName varchar(30)

insert into @ct
select ctID, ctName from tblCaseType
where ctID <> 1



set @sql = 'declare @case table(sCatId int, ctID int);' + char(10)
set @sql = @sql + 'insert into @case ' + char(10)
set @sql = @sql + 'select sCatID, caseTypeID from tblCase where caseTypeID <> 1 and CONVERT(VARCHAR(10), regDate, 121) between ''' + @pDateStart + ''' and ''' + @pDateStop + ''' and statusID = 7;' + char(10)


set @sql = @sql + ' declare @s table(mCatId int, sCatID int'
set @sqls = 'select tblSubCat.mCatID, tblSubCat.sCatID' + char(10)

set @minid = (select min(ctID) from @ct)
while not @minid is null
begin
set @ctName = (select ctName from @ct
where ctID = @minid)

set @sql = @sql + ', [' + @ctName + '] varchar(30)'
set @sqls = @sqls + ltrim(' , (select count(*) from @case where scatid = tblSubCat.sCatID and ctID = ' + ltrim(str(@minid)) + ')') + char(10)
set @minid = (select min(ctID) from @ct
where ctID > @minid)
end
set @sql = @sql + ');' + char(10)
set @sqls = @sqls + ' from tblSubCat' + char(10)
set @sql = @sql + ' insert into @s ' + char(10)

select @sql + @sqls + '; select * from @s'
</code>


Denna kod ger en textsträng:
<code>
declare @case table(sCatId int, ctID int);
insert into @case
select sCatID, caseTypeID from tblCase where caseTypeID <> 1 and CONVERT(VARCHAR(10), regDate, 121) between '2002-01-01' and '2003-02-01' and statusID = 7;
declare @s table(mCatId int, sCatID int, [Version 1] varchar(30), [Teknik] varchar(30), [Ekonomi] varchar(30), [Biologi] varchar(30), [Fysik] varchar(30), [gg] varchar(30));
insert into @s
select
tblSubCat.mCatID
, tblSubCat.sCatID
, (select count(*) from @case where scatid = tblSubCat.sCatID and ctID = 2)
, (select count(*) from @case where scatid = tblSubCat.sCatID and ctID = 7)
, (select count(*) from @case where scatid = tblSubCat.sCatID and ctID = 8)
, (select count(*) from @case where scatid = tblSubCat.sCatID and ctID = 9)
, (select count(*) from @case where scatid = tblSubCat.sCatID and ctID = 10)
, (select count(*) from @case where scatid = tblSubCat.sCatID and ctID = 11)
from tblSubCat
; select * from @s
</code>

Kör jag denna textsträng "exec(@sql + @sqls + '; select * from @s')"
får jag ut ett resultat jag är nöjd med...

* Finns det andra sätt att göra detta på (i TSQL)? Optimering, andra sql-satser...?

* Kan jag få ut resultatet av en liknade sträng
ex:
<code>
exec('select * from tblCase')
</code>
till en temptabell eller en tempvariabel?

Hur göra??


Svara

Sv: Dynamisk resultat...

Postades av 2003-08-06 11:28:38 - Andreas Hillqvist

Varför fungerar inte mitt sätt att lösa det på? Det är väl enklare? Varför har du välten som varchar istället för tal?


Svara

Sv: Dynamisk resultat...

Postades av 2003-08-06 13:19:19 - Fredrik Salomonsson

Hej Andreas.

Jag försökte få till det i morse men lyckades inte med din kod.
När du skrev tillbaka nu så försökte jag igen...

Det fungerade !!! Smart var det också...

Resultatet: (Efter lite omskrivning)




declare @pDateStart varchar(10)
declare @pDateStop varchar(10)

set @pDateStart = '2002-01-01'
set @pDateStop = '2003-09-01'

DECLARE @SQL varchar(8000)
DECLARE @Fields varchar(8000)

SET @Fields = 'tblSubCat.sCatName'

SELECT @Fields = @Fields + ', SUM(CASE tblCase.caseTypeID WHEN ' + CAST(tblCaseType.ctID AS varchar) + ' THEN 1 ELSE 0 END) AS [Antal ' + tblCaseType.ctName + ']'
FROM tblCaseType

SET @SQL = 'SELECT ' + @Fields + ' FROM tblSubCat
LEFT JOIN tblCase
ON tblSubCat.sCatID = tblCase.sCatID
where
(CONVERT(VARCHAR(10), tblCase.regDate, 121) between ''' + @pDateStart + ''' and ''' + @pDateStop + ''')
and (tblCase.statusID = 7)
GROUP BY tblSubCat.sCatName'

exec(@SQL)


Testar vidare på detta....
Fler idéer??




Svara

Sv: Dynamisk resultat...

Postades av 2003-08-06 13:26:50 - Fredrik Salomonsson

Hej igen.

Klockren. Fy fasen vad bra!
Hur kan jag nu få ut resultatet i en tabellvariabel eller temptabell???

Typ:
declare @tmp table(id int.... .... ... ... ... ... )
exec(@SQL)

select * from @tmp



Svara

Sv: Dynamisk resultat...

Postades av 2003-08-06 14:53:35 - Andreas Hillqvist

Är det inte bara att göra en SELECT ... INTO?

declare @pDateStart varchar(10)
declare @pDateStop varchar(10)

set @pDateStart = '2002-01-01'
set @pDateStop = '2003-09-01'

DECLARE @SQL varchar(8000)
DECLARE @Fields varchar(8000)

SET @Fields = 'tblSubCat.sCatName'

SELECT @Fields = @Fields + ', SUM(CASE tblCase.caseTypeID WHEN ' + CAST(tblCaseType.ctID AS varchar) + ' THEN 1 ELSE 0 END) AS [Antal ' + tblCaseType.ctName + ']'
FROM tblCaseType

SET @SQL = 'SELECT ' + @Fields + ' INTO #TempTable FROM tblSubCat
LEFT JOIN tblCase
ON tblSubCat.sCatID = tblCase.sCatID
where
(CONVERT(VARCHAR(10), tblCase.regDate, 121) between ''' + @pDateStart + ''' and ''' + @pDateStop + ''')
and (tblCase.statusID = 7)
GROUP BY tblSubCat.sCatName'

SELECT *
FROM #TempTable

DROP TABLE #TempTable


Eventuellt får du placera det två sista satserna i SQL strängen istället.


Svara

Sv: Dynamisk resultat...

Postades av 2003-08-06 15:40:53 - Fredrik Salomonsson

Hej igen...

Var tvungen att lägga in detta i strängen...
Det var det jag ville slippa...

Antar att jag får fortsätta vara i "embedded"-läge till jag har mitt färdiga resultat.
Det vill jag ju helst slippa...

Men sakta men säkert går det framåt...
Återkommer....

TACK!


Svara

Sv: Dynamisk resultat...

Postades av 2003-08-08 07:53:19 - Fredrik Salomonsson

Hej igen.

Glömde att redovisa resultatet av den färdiga frågan:



**********************************************************************
CREATE PROCEDURE dbo.sp_AHV2_HIS_R03

@pDateStart varchar(10),
@pDateStop varchar(10)
AS

set nocount on

DECLARE @SQL varchar(8000)
DECLARE @Fields varchar(8000)

SET @Fields = 'tblMainCat.mCatName as [Huvudkategori], isnull(tblSubCat.sCatName, '''') as [Underkategori]'

SELECT @Fields = @Fields + ', SUM(CASE tblCase2.caseTypeID WHEN ' + CAST(tblCaseType.ctID AS varchar) + ' THEN 1 ELSE 0 END) AS [' + tblCaseType.ctName + ']'
FROM tblCaseType
where tblCaseType.ctID <> 1

SET @SQL = 'SELECT ' + @Fields + ' FROM tblMainCat
full outer join tblSubCat
on tblMainCat.mCatID = tblSubCat.mCatID
full outer join (select caseTypeID, sCatID from tblCase where ((CONVERT(VARCHAR(10), tblCase.regDate, 121) between ''' + @pDateStart + ''' and ''' + @pDateStop + ''') and (tblCase.statusID = 7))) as tblCase2
on tblSubCat.sCatID = tblCase2.sCatID
GROUP BY tblMainCat.mCatName, tblSubCat.sCatName
order by tblMainCat.mCatName, tblSubCat.sCatName collate Finnish_Swedish_CI_AI'


exec(@SQL)
GO

**********************************************************************

Tack igen Andreas.


Svara

Sv: Dynamisk resultat...

Postades av 2003-08-08 08:51:45 - Andreas Hillqvist

JAG tycker att du kan optimera:

((CONVERT(VARCHAR(10), tblCase.regDate, 121) between ''' + @pDateStart + ''' and ''' + @pDateStop + ''')

Till:

(tblCase.regDate BETWEEN CAST(''' + @pDateStart + ''' AS datetime) AND CAST(''' + @pDateStop + ''' AS datetime))


Då konverterar du bara två konstanter istället för alla datumfält i databasen. Tror även sökmotorn kan tillgodose sig index då.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 614
27 953
271 709
513
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies