У меня есть два столбца дат, первый столбец - это дата получения заказа на поставку для проверки, второй - дата принятия или отклонения заказа на покупку. Мне нужен график с датами на оси X, а затем с количеством заказов на покупку в очереди в этот день на оси Y.

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

Пример данных ниже:

Row ID     Date In      Date Out
1          9/1/18       9/1/18
2          9/1/18       9/1/18
3          9/1/18       9/2/18
4          9/1/18       9/3/18
1          9/2/18       9/2/18
2          9/2/18       9/4/18

Таким образом, это будет 4 для 01.09.18, 4 для 9/2/18, 2 для 9/3/18 и 1 для 9/4/18.

Я задал аналогичный вопрос для Excel, и мне это удалось. Однако мы хотели бы, чтобы данные генерировались из нашей ERP-системы (в отличие от копирования данных в Excel вручную), и я подумал, что это возможно с помощью SQL и SSRS.

Формула для Excel была =COUNTIFS($A$1:$A$1000,"<="&C1,Sheet1!$B$1:$B$1000,">="&C1), поэтому A и B были столбцами Date In и Date Out соответственно, а затем C был столбцом всех дней в году.

Я не уверен, как бы мне сделать такой запрос, поэтому я начал с того, что сделал его похожим на решение Excel. Я создал список дат и пытаюсь сравнить дату в этом списке с моим набором данных дат заказа на покупку, но я не уверен, как это сделать, поскольку он сравнивает одну (строка за строкой) со многими.

1
Fred Meissner 21 Сен 2018 в 18:16

2 ответа

Лучший ответ

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

DECLARE @START_DATE AS DATE = '2018-09-01'
DECLARE @END_DATE AS DATE = '2018-09-30'

IF OBJECT_ID('tempdb..#DATES')  IS NOT NULL DROP TABLE #DATES;
IF OBJECT_ID('tempdb..#ORDERS') IS NOT NULL DROP TABLE #ORDERS;

SELECT 1 AS ROW_ID, CAST('2018-09-01' AS DATE) AS DATE_IN, CAST('2018-09-01' AS DATE) AS DATE_OUT
INTO #ORDERS
UNION
SELECT 2 AS ROW_ID, CAST('2018-09-01' AS DATE) AS DATE_IN, CAST('2018-09-01' AS DATE) AS DATE_OUT
UNION
SELECT 3 AS ROW_ID, CAST('2018-09-01' AS DATE) AS DATE_IN, CAST('2018-09-02' AS DATE) AS DATE_OUT
UNION
SELECT 4 AS ROW_ID, CAST('2018-09-01' AS DATE) AS DATE_IN, CAST('2018-09-03' AS DATE) AS DATE_OUT
UNION
SELECT 1 AS ROW_ID, CAST('2018-09-02' AS DATE) AS DATE_IN, CAST('2018-09-02' AS DATE) AS DATE_OUT
UNION
SELECT 2 AS ROW_ID, CAST('2018-09-02' AS DATE) AS DATE_IN, CAST('2018-09-04' AS DATE) AS DATE_OUT


;WITH GETDATES AS (SELECT @START_DATE AS DATE1
                  UNION ALL
                  SELECT DATEADD(DAY, 1, DATE1)
                  FROM GETDATES
                  WHERE DATE1 < @END_DATE
                 )
SELECT *
INTO #DATES
FROM GETDATES;

SELECT  DATE1, COUNT(O.ROW_ID) AS ORDERS
FROM #DATES D 
LEFT JOIN #ORDERS O ON D.DATE1 BETWEEN O.DATE_IN AND O.DATE_OUT
GROUP BY D.DATE1 
0
Hannover Fist 21 Сен 2018 в 21:41

Попробуйте сравнить с помощью ReportItems! свойство. Попробуйте написать выражение примерно так:

iif(ReportItems!DateColumnX = somevalue, "Then Do something", "Else Do Something else")

Редактирование :

Попробуйте что-то вроде этого:

Fields!ValueFromCurrentDataset(CompareLogic like(<,>,<> etc)) LookUp( Fields!ValueFromDataset2, "DataSet2")
0
Programmermid 24 Сен 2018 в 23:18