SQL GROUP BY一年中每周的总价

时间:2015-06-11 00:40:21

标签: sql ms-access

好的,所以我在这里做了一些Access,我无法弄明白,已经通过搜索尝试了很多,但没有真正接近。我希望你们中的一些人知道该怎么做。

我的数据库上有一些表(只是一个简单的学校表)

产品表

Type    Price   Color  Height Model
--------------------------------------------
KL47    69      B      150    Dames Normal Model
VRS02   73      W      170    Heren Smal Model`

副本表 - 产品

Copienr Type
------------------------
K664    KL47
T553    KL47
V3553   VRS02
V7744   VRS02
V9941   VRS02

客户表

Customrnr   Companyname  Adress
-----------------------------------------
1           Jiver        Posthoorn 27
2           Veco         Weebosserweg 21
3           V&D          Omabakfietsjes 74

最后,一张检查女巫顾客的表正在租用女巫产品

Rentnr  Customernr  Copienr Date-from   Date-Till
-------------------------------------------------------
5       3           K664    11/5/2014   11/29/2014
6       3           T553    10/7/2014   12/13/2014
7       3           V3553   11/18/2014  12/19/2014
8       3           V3553   4/8/2015    8/12/2015
9       3           V7744   4/8/2015    7/8/2015
10      3           T553    5/4/2015    6/8/2015

现在我想要一张V& D公司今年租用的所有产品的表格。 按每周总价格分组。

到目前为止,我有这个:

SELECT t.typen, c.copienr, date-from, date-till, companyname, price
FROM typen t, copies c, rented-vieuw r, customers c
WHERE bedrijfsnaam = 'V&D'
AND c.customernr = r.customernr
AND r.copienr = c.copienr
AND c.type = t.type
AND date-from >= #1/1/2015#;

此外,对于eatch周的总价格进行分组,我尝试了很多。认为即使有任何意义,但我无法弄明白。 我希望你能帮助我。谢谢!

编辑:表格产品的价格是租用产品的成本/弱***

2 个答案:

答案 0 :(得分:0)

所以这是我第一次尝试在线回答,

我对您的问题的理解是,您仅尝试使用单一公司的产品创建查询。并获得该产品的总价格。

我认为你的价格是每周价格。我添加了两列,以便您了解我所做的事情,总天数和总周数。此外,我根据您提供的拼写和描述将您的表格命名为产品,复印机 - 产品,客户和租赁

SELECT Renting.Rentnr, DateDiff("d",[Renting]![Date-from],[Renting]![Date-Till]) AS NumberDays, DateDiff("d",[Renting]![Date-from],[Renting]![Date-Till])/7 AS NumberWeeks, Custumers.Companyname, Products.Type, Products.Price, Renting.[Date-from], Renting.[Date-Till], Format([Products]![Price]*DateDiff("d",[Renting]![Date-from],[Renting]![Date-Till])/7,"Currency") AS Total
FROM Custumers INNER JOIN ((Products INNER JOIN [Copiers - Products] ON Products.Type = [Copiers - Products].Type) INNER JOIN Renting ON [Copiers - Products].Copienr = Renting.Copienr) ON Custumers.Customrnr = Renting.Customernr
WHERE (((Year([Renting]![Date-from]))=[Which year?]))
GROUP BY Renting.Rentnr, DateDiff("d",[Renting]![Date-from],[Renting]![Date-Till]), DateDiff("d",[Renting]![Date-from],[Renting]![Date-Till])/7, Custumers.Companyname, Products.Type, Products.Price, Renting.[Date-from], Renting.[Date-Till], Format([Products]![Price]*DateDiff("d",[Renting]![Date-from],[Renting]![Date-Till])/7,"Currency");

WHERE语句用于限制您选择的年份,您可以根据计算机系统时间/日期将[Which year?]更改为Now()以自动选择当前年份。

AND ((Custumers.Companyname)=[Which Company?]))添加到WHERE语句中还允许根据公司名称选择其他公司

像年份和公司这样的硬编码值意味着您的查询只有一个选项,您需要为每年和公司提供一个新查询。

我希望我已达到目标或接近它。

编辑:

我意识到我没有正确地解释这一切: DateDiff(...用于获取两个日期之间的差异," d"也就是说几天我也可以使用" ww"要询问日期之间有多少周,接下来的两个字段是您的日期字段。

所有联接都是自动生成的,因为我链接了关系窗口中的所有表。此查询是在设计视图中设计的,不使用SQL编辑器。

答案 1 :(得分:0)

您需要一份从第一个日期到最后一个日期的日期周列表。此外,您将需要ISO年份,因为这可能与日历年不同。

首先使用一个字段创建一个表NumberNumber。将其作为主要索引。

用10到9的10条记录填写。

然后创建一个查询DateFirstLast,它将第一个和最后一个日期作为参数:

PARAMETERS 
    DateFirst DateTime, 
    DateLast DateTime;
SELECT 
    DateAdd("d",[Hundred]![Number]*100+[Ten]![Number]*10+[One].[Number],[DateFirst]) AS [Date]
FROM 
    [Number] AS One, 
    [Number] AS Ten, 
    [Number] AS Hundred
WHERE 
    DateAdd("d",[Hundred]![Number]*100+[Ten]![Number]*10+[One].[Number],[DateFirst])<=[DateLast];

现在,在新查询中使用此作为源来创建ISO年周数:

SELECT 
    DateFirstLast.Date, 
    ISO_WeekYearNumber([Date]) AS YearWeek
FROM 
    DateFirstLast;

这将列出日期的日期和年 - 周数字。

例如,对于2012年,它将从2011W522013W01

计算周数的函数:

Public Function ISO_WeekYearNumber( _
  ByVal datDate As Date, _
  Optional ByRef intYear As Integer, _
  Optional ByRef bytWeek As Byte) _
  As String

' Calculates and returns year and week number for date datDate according to the ISO 8601:1988 standard.
' Optionally returns numeric year and week.
' 1998-2007, Gustav Brock, Cactus Data ApS, CPH.
' May be freely used and distributed.

  Const cbytFirstWeekOfAnyYear  As Byte = 1
  Const cbytLastWeekOfLeapYear  As Byte = 53
  Const cbytMonthJanuary        As Byte = 1
  Const cbytMonthDecember       As Byte = 12
  Const cstrSeparatorYearWeek   As String = "W"

  Dim bytMonth                  As Byte
  Dim bytISOThursday            As Byte
  Dim datLastDayOfYear          As Date

  intYear = Year(datDate)
  bytMonth = Month(datDate)
  bytWeek = DatePart("ww", datDate, vbMonday, vbFirstFourDays)

  If bytWeek = cbytLastWeekOfLeapYear Then
    bytISOThursday = Weekday(vbThursday, vbMonday)
    datLastDayOfYear = DateSerial(intYear, cbytMonthDecember, 31)
    If Weekday(datLastDayOfYear, vbMonday) >= bytISOThursday Then
      ' OK, week count of 53 is caused by leap year.
    Else
      ' Correct for Access97/2000+ bug.
      bytWeek = cbytFirstWeekOfAnyYear
    End If
  End If

  ' Adjust year where week number belongs to next or previous year.
  If bytMonth = cbytMonthJanuary Then
    If bytWeek >= cbytLastWeekOfLeapYear - 1 Then
      ' This is an early date of January belonging to the last week of the previous year.
      intYear = intYear - 1
    End If
  ElseIf bytMonth = cbytMonthDecember Then
    If bytWeek = cbytFirstWeekOfAnyYear Then
      ' This is a late date of December belonging to the first week of the next year.
      intYear = intYear + 1
    End If
  End If

  ISO_WeekYearNumber = CStr(intYear) & cstrSeparatorYearWeek & Format(bytWeek, "00")

End Function

您可以加入销售数据并应用所需分组的日期和周数列表。