2013-06-20 16 views
5

Hope ALL sta bene. Ho una rapida domanda del server SQL:come raggruppare per settimana (7 giorni) in sql sever

Vorrei mostrare la colonna della settimana in incrementi di 7 giorni. Di seguito è riportato l'esempio di output desiderato. C'è un modo per scrivere nel server SQL?

Week   Football soccer baseball 
10/01 - 10/07  1  2  3 
10/08 - 10/14  4  5  6 
10/15 - 10/21  5  8  0 

Grazie ancora! Joe

Ecco il mio script.

CREATE TABLE #TEMP 
(
DT CHAR(10), 
TO_DT CHAR(10), 
BALLs VARCHAR(100), 
PRODUCT INT, 
Week INT 
) 

DECLARE 
@DT DATETIME, 
@TO_DT DATETIME, 
@i INT 

BEGIN 
SET @_DT  = '10/01/2012' 
SET @TO_DT = DATEADD(DAY,7,@_DT) 
set @i=1 


WHILE (@DT <= '12/31/2013') 


BEGIN 
INSERT INTO #TEMP (DT, TO_DT, BALLs, PRODUCT, week) 

SELECT 
CONVERT(CHAR(10),@DT,101)     AS FROM_DT, 
CONVERT(CHAR(10),DATEADD(DAY,-1,@TO_DT),101) AS TO_DT, 
BALLS, 
COUNT(PRODUCT)     AS PRODUCT, 
@I            AS WEEK 
FROM #TABLE 
GROUP BY BALLS 

SET @DT = DATEADD(DAY,7,@DT) 
SET @TO_DT = DATEADD(DAY, 7,@TO_DT) 
set @i = @i + 1 
END 


SELECT * FROM #TEMP 

DROP TABLE #TEMP 

END 
+1

Tutto va bene. Grazie – Kermit

risposta

9

DATEDIFF (WK, 0,) dovrebbe fare il trucco.

SELECT 
    DATEDIFF(WK, 0, MyDate) 
    , COUNT(*) 
FROM (VALUES 
('2013-01-01') 
, ('2013-01-02') 
, ('2013-01-03') 
, ('2013-01-04') 
, ('2013-01-05') 
, ('2013-01-06') 
, ('2013-01-07') 
) AS X(MyDate) 
GROUP BY DATEDIFF(WK, 0, MyDate) 

EDIT:

Con data formattazione va in questo modo:

SELECT 
    CONVERT(VARCHAR(5), DATEADD(WK, WK, 0), 103) + ' - ' + CONVERT(VARCHAR(5), DATEADD(DD, 6, DATEADD(WK, WK, 0)), 103) 
    , Cnt 
FROM (
    SELECT 
     DATEDIFF(WK, 0, MyDate) AS WK 
     , COUNT(*) AS Cnt 
    FROM (VALUES 
    ('2013-01-01') 
    , ('2013-01-02') 
    , ('2013-01-03') 
    , ('2013-01-04') 
    , ('2013-01-05') 
    , ('2013-01-06') 
    , ('2013-01-07') 
    ) AS X(MyDate) 
    GROUP BY DATEDIFF(WK, 0, MyDate) 
) AS X  
+0

@ Serge, ho modificato il mio script usando il TUO concetto e ha funzionato. Tuttavia, vorrei mostrare il risultato a partire dal 10/1/12 al 10/7/12, dal 10/8/12 al 10/14/12 e dal 15/10/12 al 10/21/12 ... Penso che sia necessario un po 'di tempo, sì? – joe

+0

@joe: nella versione modificata, prova a sostituire 'DATEDIFF (WK, 0, MyDate)' nella subquery (entrambe le voci) con 'DATEDIFF (DAY, @YourStartDate, MyDate)/7' e' DATEADD (WK, WK, 0) 'nella query principale (entrambe le voci) con' DATEADD (WK, WK, @YourStartDate) '. –

+0

@ Andriy M, grazie per il tocco. Funziona perfettamente. I risultati mostrano il giorno prima e il mese successivo. L'esempio di esecuzione di questo script mostra 01/10 anziché 10/1. Immagino di aver visto i film dell'Air Force One troppe volte. Cito 'Quando gli dai latte, vuole dei biscotti'. Spero di essere diverso. Grazie ancora. – joe

Problemi correlati