Я пытаюсь сделать СЧЕТ против таблицы, используя диапазон дат, из другой таблицы. Количество должно также совпадать со ссылочным номером, вот формат данных:

[Rev Old New] (Table 1)
Id   Start        Finish      Amount    Calls
41   2018-01-01   2018-06-01  111.01

[Calls]  (Table 2)
Id   Date         Amount
3    2018-05-05   12.1
41   2018-01-03   11.7
41   2018-06-11   12.9

Я совершенно новичок в MS SQL, поэтому прошу прощения за мои довольно базовые знания!

Итак, я хочу подсчитать количество строк в [Calls], где Date находится между датами Start и Finish в [Rev Old New], а идентификатор одинаков в обеих таблицах (это ссылка клиента)

Я хочу ОБНОВИТЬ [Rev Old New] с этим значением в [Calls]

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

UPDATE [Insight].[dbo].[Rev Old New]. t2
SET [Calls] = 
(SELECT COUNT(CASE WHERE t1.Date BETWEEN t2.[Start] AND t2.[Finish])
FROM [Insight].[dbo].[Calls] t1
WHERE t1.[Id] = t2.[Id])

Я получаю такую ​​ошибку:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 't2'.
Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'WHERE'.
2
davidjwest 21 Авг 2018 в 11:53

3 ответа

Лучший ответ

Вам не нужен оператор CASE, достаточно простого WHERE:

UPDATE [Insight].[dbo].[Rev Old New]
SET [Rev Old New].[Calls] = (SELECT COUNT(*) FROM [Insight].[dbo].[Calls] t1
                  WHERE t1.Date BETWEEN [Rev Old New].[Start] AND [Rev Old New].[Finish])
1
Diado 21 Авг 2018 в 09:38

Это может помочь

    CREATE TABLE #RevOldNew(Id BIGINT, Start DATETIME,  Finish DATETIME,  Amount BIGINT,  Calls INT)

    CREATE TABLE #Calls(Id BIGINT,[Date] DATETIME, AMOUNT BIGINT)



    INSERT INTO #RevOldNew
    SELECT 1,'2018-06-01','2018-06-15',NULL,NULL UNION ALL
    SELECT 1,'2018-07-16','2018-07-31',NULL,NULL UNION ALL
    SELECT 1,'2018-08-01','2018-08-15',NULL,NULL UNION ALL
    SELECT 1,'2018-08-16','2018-08-31',NULL,NULL UNION ALL

    SELECT 2,'2018-07-01','2018-07-15',NULL,NULL UNION ALL
    SELECT 2,'2018-08-01','2018-08-15',NULL,NULL UNION ALL
    SELECT 2,'2018-08-16','2018-08-31',NULL,NULL UNION ALL

    SELECT 3,'2018-07-16','2018-07-31',NULL,NULL UNION ALL
    SELECT 3,'2018-08-01','2018-08-15',NULL,NULL UNION ALL
    SELECT 3,'2018-08-16','2018-08-31',NULL,NULL 


    INSERT INTO #Calls
    SELECT 1,'2018-07-16',23 UNION ALL
    SELECT 1,'2018-07-21',534 UNION ALL
    SELECT 1,'2018-07-28',456 UNION ALL

    SELECT 1,'2018-08-02',43 UNION ALL
    SELECT 1,'2018-08-11',565 UNION ALL

    SELECT 1,'2018-08-20',56 UNION ALL

    SELECT 2,'2018-07-05',576 UNION ALL

    SELECT 2,'2018-08-22',54 UNION ALL
    SELECT 2,'2018-08-29',676 UNION ALL

    SELECT 3,'2018-07-17',32 UNION ALL
    SELECT 3,'2018-08-15',43


    ;with cte
    As (
        SELECT r.id,r.Start,r.Finish, SUM(c.AMOUNT) Amount, COUNT(c.id) calls
        FROM #RevOldNew r
        LEFT JOIN #Calls c on r.id=c.id and c.Date between r.Start and r.Finish
        Group by r.id,r.Start,r.Finish
    )


    UPDATE r
    SET r.Amount=c.Amount,
            r.Calls=c.calls 
    FROM #RevOldNew r
    JOIN cte c on c.id=r.id and c.Start=r.Start and c.Finish=r.Finish


    SELECT * from #RevOldNew

    DROP TABLE #RevOldNew
    DROP TABLE #Calls
1
Sahi 21 Авг 2018 в 09:17

Во-первых, вы должны избегать пробелов в именах таблиц. Это не хорошая практика.

Тогда запрос, который решает вашу проблему:

Обновить [Rev Old New] установить Calls = (выбрать количество (*) из Calls, где [Rev Old New] .id = Calls.id и Calls.date> = [Rev Old New] .Start and Calls.date <= [Rev] Старый Новый]. Финиш)

Где

Выберите количество (*) из вызовов, где [Rev Old New] .id = Calls.id и Calls.date> = [Rev Old New] .Start and Calls.date <= [Rev Old New] .Finish

Посчитать строки из Calls с идентификатором в [Rev Old New] с датой в Calls между Finish и Start (в комплекте) в [Rev Old New]

Надеюсь, это поможет.

1
Patrick Vanhuyse 21 Авг 2018 в 09:22
51945017