好的,所以我在这里做了一些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周的总价格进行分组,我尝试了很多。认为即使有任何意义,但我无法弄明白。 我希望你能帮助我。谢谢!
编辑:表格产品的价格是租用产品的成本/弱***
答案 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年份,因为这可能与日历年不同。
首先使用一个字段创建一个表Number
:Number
。将其作为主要索引。
用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年,它将从2011W52
到2013W01
。
计算周数的函数:
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
您可以加入销售数据并应用所需分组的日期和周数列表。