Group By SQL 语句 - 将结果合并到一行

发布于 2024-12-25 14:43:49 字数 2109 浏览 6 评论 0原文

我创建了一个名为 tbl_timesheet_hours 的数据库表,如下所示:

timesheet_no
work_order_no
work_order_date
work_order_hours

表中填充的数据如下:

timesheet_no    work_order_no   work_order_date     work_order_hours
4               NTS0026B        2012-01-02          1
4               NTS0031B        2012-01-02          9
4               NTS0031B        2012-01-03          8
4               NTS0031B        2012-01-04          7
4               NTS0031B        2012-01-05          6
4               NTS0031B        2012-01-06          5
4               NTS0031B        2012-01-07          4
4               NTS0031B        2012-01-08          3

我需要创建一个查询,该查询将构成考勤表报告的基础,该考勤表报告可以以典型承包商的考勤表格式打印,即将在第一列中显示 work_order_no 字段,后面是每天分配的小时数。我创建的查询是:

SELECT
  work_order_no,
  switch(Format(work_order_date,'ddd') = "Mon", SUM(work_order_hours)) AS [Mon],
  switch(Format(work_order_date,'ddd') = "Tue", SUM(work_order_hours)) AS [Tue],
  switch(Format(work_order_date,'ddd') = "Wed", SUM(work_order_hours)) AS [Wed],
  switch(Format(work_order_date,'ddd') = "Thu", SUM(work_order_hours)) AS [Thu],
  switch(Format(work_order_date,'ddd') = "Fri", SUM(work_order_hours)) AS [Fri],
  switch(Format(work_order_date,'ddd') = "Sat", SUM(work_order_hours)) AS [Sat],
  switch(Format(work_order_date,'ddd') = "Sun", SUM(work_order_hours)) AS [Sun]
FROM tbl_timesheet_hours
WHERE timesheet_no=4
GROUP BY work_order_date, work_order_no;

查询产生以下结果集,

work_order_no   Mon Tue Wed Thu Fri Sat Sun
NTS0026B         1                      
NTS0031B         9                      
NTS0031B             8                  
NTS0031B                 7              
NTS0031B                     6          
NTS0031B                         5      
NTS0031B                             4  
NTS0031B                                 3

是否可以重构查询以产生以下结果集?

work_order_no   Mon Tue Wed Thu Fri Sat Sun
NTS0026B        1                       
NTS0031B        9   8   7   6   5   4   3

任何类型的帮助将不胜感激。谢谢。

I have created a database table called tbl_timesheet_hours as follows:

timesheet_no
work_order_no
work_order_date
work_order_hours

with data populated in the table as:

timesheet_no    work_order_no   work_order_date     work_order_hours
4               NTS0026B        2012-01-02          1
4               NTS0031B        2012-01-02          9
4               NTS0031B        2012-01-03          8
4               NTS0031B        2012-01-04          7
4               NTS0031B        2012-01-05          6
4               NTS0031B        2012-01-06          5
4               NTS0031B        2012-01-07          4
4               NTS0031B        2012-01-08          3

I need to create a query which will form the basis for a time sheet report which can be printed in a typical contractor's time sheet format, i.e, it will show the work_order_no field in the first column, followed by hours allocated for each day. The query I have created is:

SELECT
  work_order_no,
  switch(Format(work_order_date,'ddd') = "Mon", SUM(work_order_hours)) AS [Mon],
  switch(Format(work_order_date,'ddd') = "Tue", SUM(work_order_hours)) AS [Tue],
  switch(Format(work_order_date,'ddd') = "Wed", SUM(work_order_hours)) AS [Wed],
  switch(Format(work_order_date,'ddd') = "Thu", SUM(work_order_hours)) AS [Thu],
  switch(Format(work_order_date,'ddd') = "Fri", SUM(work_order_hours)) AS [Fri],
  switch(Format(work_order_date,'ddd') = "Sat", SUM(work_order_hours)) AS [Sat],
  switch(Format(work_order_date,'ddd') = "Sun", SUM(work_order_hours)) AS [Sun]
FROM tbl_timesheet_hours
WHERE timesheet_no=4
GROUP BY work_order_date, work_order_no;

The query produces the following result set,

work_order_no   Mon Tue Wed Thu Fri Sat Sun
NTS0026B         1                      
NTS0031B         9                      
NTS0031B             8                  
NTS0031B                 7              
NTS0031B                     6          
NTS0031B                         5      
NTS0031B                             4  
NTS0031B                                 3

Is it possible to restructure the query to produce the following result set?

work_order_no   Mon Tue Wed Thu Fri Sat Sun
NTS0026B        1                       
NTS0031B        9   8   7   6   5   4   3

Any type of assistance would be greatly appreciated. Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乞讨 2025-01-01 14:43:49

您将使用交叉表查询,如下所示:

TRANSFORM Sum(tbl_timesheet_hours.[work_order_hours]) AS SumOfwork_order_hours
SELECT tbl_timesheet_hours.[work_order_no], Sum(tbl_timesheet_hours.[work_order_hours]) AS     [Total Of work_order_hours]
FROM tbl_timesheet_hours
GROUP BY tbl_timesheet_hours.[work_order_no]
ORDER BY Format([work_order_date],'ddd')
PIVOT Format([work_order_date],'ddd') In ("Mon","Tue","Wed","Thu","Fri","Sat","Sun");

You would use a Crosstab query as follows:

TRANSFORM Sum(tbl_timesheet_hours.[work_order_hours]) AS SumOfwork_order_hours
SELECT tbl_timesheet_hours.[work_order_no], Sum(tbl_timesheet_hours.[work_order_hours]) AS     [Total Of work_order_hours]
FROM tbl_timesheet_hours
GROUP BY tbl_timesheet_hours.[work_order_no]
ORDER BY Format([work_order_date],'ddd')
PIVOT Format([work_order_date],'ddd') In ("Mon","Tue","Wed","Thu","Fri","Sat","Sun");
北陌 2025-01-01 14:43:49

您是否尝试过在 SUM() 内使用 SWITCH 表达式?像这样:

SELECT
  work_order_no,
  SUM(switch(Format(work_order_date,'ddd') = "Mon", work_order_hours)) AS [Mon],
  SUM(switch(Format(work_order_date,'ddd') = "Tue", work_order_hours)) AS [Tue],
  SUM(switch(Format(work_order_date,'ddd') = "Wed", work_order_hours)) AS [Wed],
  SUM(switch(Format(work_order_date,'ddd') = "Thu", work_order_hours)) AS [Thu],
  SUM(switch(Format(work_order_date,'ddd') = "Fri", work_order_hours)) AS [Fri],
  SUM(switch(Format(work_order_date,'ddd') = "Sat", work_order_hours)) AS [Sat],
  SUM(switch(Format(work_order_date,'ddd') = "Sun", work_order_hours)) AS [Sun]
FROM tbl_timesheet_hours
WHERE timesheet_no=4
GROUP BY work_order_no;

除此之外,还从 GROUP BY 中删除 work_order_date

Have you tried using the SWITCH expression inside SUM()? Like this:

SELECT
  work_order_no,
  SUM(switch(Format(work_order_date,'ddd') = "Mon", work_order_hours)) AS [Mon],
  SUM(switch(Format(work_order_date,'ddd') = "Tue", work_order_hours)) AS [Tue],
  SUM(switch(Format(work_order_date,'ddd') = "Wed", work_order_hours)) AS [Wed],
  SUM(switch(Format(work_order_date,'ddd') = "Thu", work_order_hours)) AS [Thu],
  SUM(switch(Format(work_order_date,'ddd') = "Fri", work_order_hours)) AS [Fri],
  SUM(switch(Format(work_order_date,'ddd') = "Sat", work_order_hours)) AS [Sat],
  SUM(switch(Format(work_order_date,'ddd') = "Sun", work_order_hours)) AS [Sun]
FROM tbl_timesheet_hours
WHERE timesheet_no=4
GROUP BY work_order_no;

In addition to that, remove also work_order_date from GROUP BY.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文