【问题标题】:Completely group by month in query?在查询中完全按月分组?
【发布时间】:2018-08-30 02:05:30
【问题描述】:

我正在尝试在 Access 中编写一个 SQL 查询,这让我发疯。

表 1 有我的日期列(只有一个月的 1 号或 15 号,格式为 mm/dd/yyyy)。我也在此处为每个字段使用 ID 号来获取计数。它可以追溯到 2013 年,但我只想要 2018 年。

表 2 包含格式为 (mmmmm/yy) 的月份和该月份的数量预测。

目标再次是能够连接两个表以比较实际与预计。

不过,无论我使用什么查询,当我加入时,我都没有得到正确的总数。 IE。 2018 年 1 月总共可能有 350 条(1 日和 15 日之间),但是当我加入表格时,只会遇到每个月 1 日的记录,例如当年 1 月显示 300 条。我一直在疯狂地玩弄日期格式,无论出于何种原因,它都拒绝像我想要的那样工作。如果我进行左连接,它将每个月显示 2 个条目 - 表 2 上没有来自第 15 个日期的相应投影数据,所以这一定是问题所在。就是修不了。下面是我的查询。非常感谢。

SELECT Format(([Table1].[Date]), "m/yy") AS [Month],
   Count([Table1].[ID]) AS Total,
   [Table2].Projection,
   FROM [Table1]
   INNER JOIN [Table2]
   ON [Table1].[Date] = [Table2].[Projection Date]
   WHERE ((([Table1].[Date]) Between [Enter Begin Date] And [Enter End Date])) 
   '''using all of 2018, so between 1/18 and 12/18
   GROUP BY Format(([Table1]),"m/yy"),[Table2].[Projection];

表 1 数据示例:

ID       Date
1107     1/01/2018
1233     1/15/2018
1500     2/1/2018

表 2 数据示例:

Projection Date     Projection
January18              270
February18             283    

使用上述代码的示例输出:

Date     Total    Projection
Jan18     300         270
Feb18     301         283
March18   373         300

使用左连接的示例输出:

Date     Total    Projection
Jan18     300         270
Jan18     50          
Feb18     301         283
Feb18     60
March18   373         300
March18   38

期望的输出

Date     Total    Projection
Jan18     350         270
Feb18     361         283
March18   411         300

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。
  • 如前所述,如果不了解所涉及的内容并知道您期望的结果,就不可能说出问题所在。
  • 当您说Table 2 has the month in format (mmmmm/yy) 时,这是否意味着该字段存储为文本? (数据类型为Date 的表中的值未格式化。)
  • 首先将所有日期字段更改为数据类型Date/Time。 “2018 年 1 月”的值可以存储为当月的第一天,因此 1/1/2018。您可能已经注意到,在使用这些值进行计算时,这可能非常重要。

标签: sql ms-access jet


【解决方案1】:
  • 您需要将 [Table1].[Date] 转换为 INNER JOIN 中的 nvarchar,这应该是 LEFT JOIN。
  • 我假设 [Table2].[Projection Date] 是 nvarchar “字符串”?
  • 您的 GROUP BY 需要匹配 SELECT 中的非聚合。
  • 在您的 SELECT 中,您还需要在 join 返回 NULL 时返回 0 投影。

如果 [Table2].[Projection Date] 存储为文本,请尝试使用以下内容;

    SELECT 
        Format(([Table1].[Date]), "MMM/yy") AS [Month],
        Count([Table1].[ID]) AS Total,
        ISNULL([Table2].Projection, 0) AS 'Projection'
    FROM [Table1]
        LEFT JOIN [Table2]
            ON FORMAT([Table1].[Date], 'MMM/yy') = [Table2].[Projection Date]
    WHERE ((([Table1].[Date]) Between [Enter Begin Date] And [Enter End Date])) 
    GROUP BY Format(([Table1].[Date]),"MMM/yy"),[Table2].[Projection];

如果 [Table2].[Projection Date] 存储为日期,则需要将 EOMONTH() 添加到联接中,无需格式化 [Table1].[Date],试试这个;

SELECT 
    Format(([Table1].[Date]), "MMM/yy") AS [Month],
    Count([Table1].[ID]) AS Total,
    ISNULL([Table2].Projection, 0) AS 'Projection'
FROM [Table1]
    LEFT JOIN [Table2]
        ON EOMONTH([Table1].[Date]) = EOMONTH([Table2].[Projection Date])
WHERE ((([Table1].[Date]) Between [Enter Begin Date] And [Enter End Date])) 
GROUP BY Format(([Table1].[Date]),"MMM/yy"),[Table2].[Projection];

抱歉所有的修改!

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多