Оператор Group By SQL - объединение результатов в одной строке - PullRequest
1 голос
/ 09 января 2012

Я создал таблицу базы данных с именем 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

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 января 2012

Вы бы использовали кросс-таблицу следующим образом:

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");
0 голосов
/ 09 января 2012

Вы пытались использовать выражение SWITCH внутри SUM()? Как это:

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;

В дополнение к этому, удалите также work_order_date из GROUP BY.

...