Toon posts:

[SQL] view maken met weken

Pagina: 1
Acties:
  • 215 views

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Onderstaande view wordt gegenereerd op het moment als deze wordt aangesproken

[code=sql]
CREATE VIEW dbo.V_WK4_BestelOverzicht1 AS
SELECT Object_id, SUM(- Quantity_Requested_in_Stock_UM) AS Aantal FROM dbo.V_tblOrderregels_ST
WHERE
(Movement_Status = '90') AND (Movement_Type = '01') AND
((CASE WHEN DATEPART(wk, Date_Actual ) + 1 - DATEPART(wk, CAST(DATEPART(yy, Date_Actual ) AS CHAR(4)) + '0104') = 0
THEN ((year(Date_Actual ) - 1) * 100) + (DATEPART(wk, (CAST((year(Date_Actual ) - 1) AS CHAR(4)) + '1231')) + 1 - DATEPART(wk, CAST((year(Date_Actual ) - 1) AS CHAR(4)) + '0104'))
ELSE (CASE WHEN ((DATEPART(mm, Date_Actual ) = 12) AND ((DATEPART(dd, Date_Actual ) - DATEPART(dw, Date_Actual )) >= 28))
THEN (YEAR(Date_Actual ) * 100) + 1
ELSE (YEAR(Date_Actual ) * 100) + (DATEPART(wk, Date_Actual ) + 1 - DATEPART(wk, CAST(DATEPART(yy, Date_Actual ) AS CHAR(4)) + '0104')) END) END) = (CASE WHEN DATEPART(wk, GETDATE()-28) + 1 - DATEPART(wk, CAST(DATEPART(yy, GETDATE()-28) AS CHAR(4)) + '0104') = 0

THEN ((year(GETDATE()-28) - 1) * 100) + (DATEPART(wk, (CAST((year(GETDATE()-28) - 1) AS CHAR(4)) + '1231')) + 1 - DATEPART(wk, CAST((year(GETDATE()-28) - 1) AS CHAR(4)) + '0104'))

ELSE (CASE WHEN ((DATEPART(mm, GETDATE()-28) = 12) AND ((DATEPART(dd, GETDATE()-28) - DATEPART(dw, GETDATE()-28)) >= 28))
THEN (YEAR(GETDATE()-28) * 100) + 1 ELSE (YEAR(GETDATE()-28) * 100) + (DATEPART(wk, GETDATE()-28) + 1 - DATEPART(wk, CAST(DATEPART(yy, GETDATE()-28) AS CHAR(4)) + '0104')) END) END))
GROUP BY Object_id
[/code=sql]

Ik heb hem zelf niet gemaakt en snap niks van deze opbouw.

Op deze manier pakt hij de data van 4 weken geleden. Deze moet veel makkelijker kunnen want hij geeft erg veel time-out's hierop.

Heeft iemand een idee hoe je makkelijk data van 4 weken geleden kan opzoeken

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Mischien een idee om eerst uit te zoeken hoe de query werkt?Dan zie je ook wel waar de bottleneck zit ;).

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-09 10:03

MBV

Begin eens met die query een nette layout te geven: begin dus met [code=sql] ipv gewone code, haal de quotes eromheen weg, en zet elke belangrijke statement op een nieuwe regel met de goeie indenting. Dat is toch wel de minste moeite die je er zelf in kan stoppen.
Kijk maar hiernaar:
code:
1
"SELECT * FROM table WHERE x = 5"

en deze:
SQL:
1
2
3
SELECT *
FROM table
WHERE x = 5

Dat laatste is een stuk makkelijker leesbaar, zeker als het anders niet meer op een regel past ;)

[ Voor 29% gewijzigd door MBV op 02-12-2008 13:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Boudewijn schreef op dinsdag 02 december 2008 @ 12:58:
Mischien een idee om eerst uit te zoeken hoe de query werkt?Dan zie je ook wel waar de bottleneck zit ;).
Ik snap de query niet, daarom vraag ik ofdat iemand hem kan ontcijferen en / of een betere optie heeft

Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 26-09 09:11

sopsop

[v] [;,,;] [v]

Wat een zooi. Zorg eens dat die query netjes opgemaakt in het code blok staat en niet op een regel.

Maar om met een datum te rekenen kun je de dateadd functie gebruiken (http://msdn.microsoft.com/en-us/library/ms186819.aspx)

=edit=
OMG
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE VIEW dbo.V_WK4_BestelOverzicht1 AS 
    SELECT Object_id, SUM(- Quantity_Requested_in_Stock_UM) AS Aantal 
    FROM dbo.V_tblOrderregels_ST 
    WHERE  AND (Movement_Status = '90') 
    AND (Movement_Type = '01') 
    AND (  ( CASE WHEN DATEPART(wk, Date_Actual) + 1 - DATEPART(wk, CAST(DATEPART(yy, Date_Actual) AS CHAR(4)) + '0104') = 0 
                  THEN ((year(Date_Actual     ) - 1) * 100) + (DATEPART(wk, (CAST((year(Date_Actual     ) - 1) AS CHAR(4)) + '1231')) + 1 - DATEPART(wk, CAST((year(Date_Actual     ) - 1) AS CHAR(4)) + '0104')) 
                  ELSE ( CASE WHEN ((DATEPART(mm, Date_Actual     ) = 12) AND ((DATEPART(dd, Date_Actual     ) - DATEPART(dw, Date_Actual     )) >= 28)) 
                              THEN (YEAR(Date_Actual     ) * 100) + 1 
                              ELSE (YEAR(Date_Actual     ) * 100) + (DATEPART(wk, Date_Actual     ) + 1 - DATEPART(wk, CAST(DATEPART(yy, Date_Actual     ) AS CHAR(4)) + '0104')) 
                              END) 
                  END)       
         = (CASE WHEN DATEPART(wk, GETDATE()-28) + 1 - DATEPART(wk, CAST(DATEPART(yy, GETDATE()-28) AS CHAR(4)) + '0104') = 0 
                 THEN ((year(GETDATE()-28) - 1) * 100) + (DATEPART(wk, (CAST((year(GETDATE()-28) - 1) AS CHAR(4)) + '1231')) + 1 - DATEPART(wk, CAST((year(GETDATE()-28) - 1) AS CHAR(4)) + '0104')) 
                 ELSE (CASE WHEN ((DATEPART(mm, GETDATE()-28) = 12) AND ((DATEPART(dd, GETDATE()-28) - DATEPART(dw, GETDATE()-28)) >= 28)) 
                            THEN (YEAR(GETDATE()-28) * 100) + 1 
                            ELSE (YEAR(GETDATE()-28) * 100) + (DATEPART(wk, GETDATE()-28) + 1 - DATEPART(wk, CAST(DATEPART(yy, GETDATE()-28) AS CHAR(4)) + '0104')) 
                       END) 
                 END)
        ) 
  GROUP BY Object_id 


Dit is wel zo ongeloofelijk ranzig.

Volgens mij moet dit afdoende zijn (mits T-SQL):
SQL:
1
2
3
4
5
6
CREATE VIEW dbo.V_WK4_BestelOverzicht1 AS  
    SELECT Object_id, SUM(- Quantity_Requested_in_Stock_UM) AS Aantal  
    FROM dbo.V_tblOrderregels_ST  
    WHERE  AND (Movement_Status = '90')  
    AND (Movement_Type = '01')  
    AND Date_Actual >= DateAdd('w',-4,GetDate())

[ Voor 87% gewijzigd door sopsop op 02-12-2008 13:14 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
sopsop schreef op dinsdag 02 december 2008 @ 13:03:
Wat een zooi. Zorg eens dat die query netjes opgemaakt in het code blok staat en niet op een regel.

Maar om met een datum te rekenen kun je de dateadd functie gebruiken (http://msdn.microsoft.com/en-us/library/ms186819.aspx)
ik was zelf ook al bezig geweest om hem beter te laten zien. Het prrobleem is ook dat hij deze view 4 keer doet, van vorige week, twee weken geleden, drie weken geleden en vier weken geleden.

Dan krijg je time-out's

[ Voor 16% gewijzigd door Verwijderd op 02-12-2008 13:13 ]


Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 26-09 09:11

sopsop

[v] [;,,;] [v]

Je kunt de time-out hoger zetten. Dat sluit ook naadloos aan bij de werkwijze van de 'programmeur' die deze query heeft gebouwd.

=edit=
Onderstaande view wordt gegenereerd op het moment als deze wordt aangesproken
Waar slaat dit op trouwens? Wordt de view aangemaakt en daarna weer weggepleurd? Dus iedere keer een create view, i.p.v. de view één keer aanmaken en daarna de view als tabel aanspreken? Indien ja: waarom geen stored procedure?

[ Voor 56% gewijzigd door sopsop op 02-12-2008 13:20 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Euh; we verwachten wel dat je enigszins weet waar je mee bezig bent. Een query (andermans of niet) dumpen en dan vragen of wij er wat mee kunnen is gewoon anderen je klusje laten opknappen en daar hebben we jobs.tweakers.net voor ;) Zie ook quickfix

[ Voor 5% gewijzigd door RobIII op 02-12-2008 13:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.