как объединить несколько операторов выбора и ввода в одну таблицу

#sql-server-2012

#sql-server-2012

Вопрос:

У меня есть таблица с датами завершения (DT_SolutionStatus_HW). я хочу создать диаграмму, которая показывает совокупное количество завершений с течением времени, а это значит, что мне нужно создать таблицу, содержащую подсчет по месяцам каждого завершения. Я не могу понять, как сделать так, чтобы каждый оператор select отображался как отдельный столбец (например, январь, февраль, март и т.д.). Это начало моего sql-кода, поскольку я не смог придумать, как это сделать.

MS SQL SERVER

 Select Distinct count (StarterKit) as [Jan]  From DT_SolutionStatus_HW where ARBApprove Between'1/1/21' and '1/31/21'

Select Distinct count (StarterKit) as [Feb]  From DT_SolutionStatus_HW where ARBApprove Between'2/1/21' and '2/28/21'

Select Distinct count (StarterKit) as [Mar]  From DT_SolutionStatus_HW where ARBApprove Between'3/1/21' and '3/31/21'

Select Distinct count (StarterKit) as [Apr]  From DT_SolutionStatus_HW where ARBApprove Between'4/1/21' and '4/30/21'

Select Distinct count (StarterKit) as [May]  From DT_SolutionStatus_HW where ARBApprove Between'5/1/21' and '5/31/21'

Select Distinct count (StarterKit) as[Jun]  From DT_SolutionStatus_HW where ARBApprove Between'6/1/21' and '6/30/21'

Select Distinct count (StarterKit)as[Jul] From DT_SolutionStatus_HW where ARBApprove Between'7/1/21' and '7/31/21'

Select Distinct count (StarterKit) as[Aug]  From DT_SolutionStatus_HW where ARBApprove Between'8/1/21' and '8/31/21'

Select Distinct count (StarterKit) as[Sep]  From DT_SolutionStatus_HW where ARBApprove Between'9/1/21' and '9/30/21'

Select Distinct count (StarterKit) [Oct]  From DT_SolutionStatus_HW where ARBApprove Between'10/1/21' and '10/31/21'

Select Distinct count (StarterKit) [Nov] From DT_SolutionStatus_HW where ARBApprove Between'11/1/21' and '11/30/21'

Select Distinct count (StarterKit) [Dec] From DT_SolutionStatus_HW where ARBApprove Between'12/1/21' and '12/31/21'
 

Комментарии:

1. Что distinct count... делает, я не думаю, что это делает то, что вы думаете

Ответ №1:

Id повторяет комментарии Charlieface выше (у меня недостаточно репутации, чтобы добавить в качестве комментария).. кроме того, что происходит, когда вы переходите на несколько лет?

Лучшим вариантом было бы создать единый запрос, отображающий результаты каждого из отдельных строк. Это позволит вам выполнять лучшую агрегацию по временным рамкам, а не добавлять столбцы вместе.

 SELECT FORMAT(DATEFROMPARTS(YEAR(ARBApprove), MONTH(ARBApprove), 01), 'MMM'),
       COUNT(StarterKit) as StarterKit_Volume
FROM DT_SolutionStatus_HW
GROUP BY FORMAT(DATEFROMPARTS(YEAR(ARBApprove), MONTH(ARBApprove), 01), 'MMM')
 

Пример того, как должны храниться данные:

 JAN-21 | 5
FEB-21 | 10
....
 

Тогда отображение этого в виде отдельных столбцов будет задачей отображения, а не задачей кода. Если вам действительно нужно сделать это в коде, тогда вам нужно будет преобразовать результаты.

 SELECT [JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[SEP],[OCT],[NOV],[DEC]
FROM  
(SELECT FORMAT(DateFromParts(Year(ARBApprove), Month(ARBApprove), 01),'MMM'), COUNT(StarterKit) AS StarterKit_Volume
FROM DT_SolutionStatus_HW
GROUP BY  FORMAT(DateFromParts(Year(ARBApprove), Month(ARBApprove), 01),'MMM')) AS SourceTable  
PIVOT  
(  
SUM(StarterKit_Volume)  
FOR Month IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[SEP],[OCT],[NOV],[DEC])  
) AS PivotTable;