web-dev-qa-db-fra.com

Sélectionner les résultats SQL regroupés par semaines

Je veux sélectionner des données du groupe de tables suivant par semaines

 Date       Product Name   Sale
+----------+--------------+-----+
 14-05-11     a             2
 14-05-11     b             4 
 17-05-11     c             3
 19-05-11     a             6
 24-05-11     a             6
 29-05-11     a             6    

Supposons qu'aujourd'hui soit 30-05-11

Donc, mon résultat devrait ressembler à ceci.

 Product Name         First Week   Second Week  Third Week
+--------------------+------------+------------+-------------+
   a                      12            6           2
   b                       0            0           4 
   c                       0            3           0  

Est-ce que certains corps me guidera sur la façon d'écrire une requête SQL pour obtenir ce comportement!

22
Zain Ali

Je pense que cela devrait le faire ..

Select 
ProductName,
WeekNumber,
sum(sale)
from
(
    SELECT 
    ProductName,
    DATEDIFF(week, '2011-05-30', date) AS WeekNumber,
    sale
    FROM table
)
GROUP BY
ProductName,
WeekNumber
35
StevieG

Cela devrait le faire pour vous:

Declare @DatePeriod datetime

Set @DatePeriod = '2011-05-30'

Select  ProductName,
        IsNull([1],0) as 'Week 1',
        IsNull([2],0) as 'Week 2',
        IsNull([3],0) as 'Week 3',
        IsNull([4],0) as 'Week 4',
        IsNull([5], 0) as 'Week 5'

From 
(
Select  ProductName,
        DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH, 0, InputDate), 0), InputDate) +1 as [Weeks],
        Sale as 'Sale'

From dbo.YourTable
-- Only get rows where the date is the same as the DatePeriod
-- i.e DatePeriod is 30th May 2011 then only the weeks of May will be calculated
Where DatePart(Month, InputDate)= DatePart(Month, @DatePeriod)
)p 
Pivot (Sum(Sale) for Weeks in ([1],[2],[3],[4],[5])) as pv

Il calculera le numéro de semaine par rapport au mois. Ainsi, au lieu de la semaine 20 pour l'année, ce sera la semaine 2. La variable @DatePeriod permet d'extraire uniquement les lignes relatives au mois (dans cet exemple, uniquement pour le mois de mai)

Sortie en utilisant mes données d'échantillon:

enter image description here

13
codingbadger

les solutions proposées semblent un peu complexes? cela pourrait aider:

https://msdn.Microsoft.com/en-us/library/ms174420.aspx

select
   mystuff,
   DATEPART ( year, MyDateColumn ) as yearnr,
   DATEPART ( week, MyDateColumn ) as weeknr
from mytable
group by ...etc
3
increddibelly
Declare @DatePeriod datetime
Set @DatePeriod = '2011-05-30'

Select  ProductName,
        IsNull([1],0) as 'Week 1',
        IsNull([2],0) as 'Week 2',
        IsNull([3],0) as 'Week 3',
        IsNull([4],0) as 'Week 4',
        IsNull([5], 0) as 'Week 5'
From 
(
Select  ProductName,
        DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH, 0, '2011-05-30'), 0), '2011-05-30') +1 as [Weeks],
        Sale as 'Sale'
From dbo.WeekReport

-- Only get rows where the date is the same as the DatePeriod
-- i.e DatePeriod is 30th May 2011 then only the weeks of May will be calculated
Where DatePart(Month, '2011-05-30')= DatePart(Month, @DatePeriod)
)p 
Pivot (Sum(Sale) for Weeks in ([1],[2],[3],[4],[5])) as pv

SORTIE COMME CE

a   0   0   0   0   20
b   0   0   0   0   4
c   0   0   0   0   3
0
Milton