Почему в моем запросе не работает перекрестное соединение? - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь получить сумму inv.ServicePrice без использования sum и group by, но мой запрос не работает.

ALTER PROCEDURE [dbo].[ServicesDetailedReport] 

        @FromDate date= '01-Jun-2010',
        @ToDate date= null

AS
BEGIN
        Set @ToDate= case when @ToDate IS NULL then Convert(varchar(11), getdate(), 106) else @ToDate end

        Select inv.InvoiceNo, inv.EntryDateTime, s.ServiceName, c.VehicleRegNo, inv.ServicePrice, c.CustomerName, inv.fk_BookingID
        from dbo.[Services] s
        inner join invoices inv
        on inv.fk_ServiceID= s.ServiceID
        inner join customers c
        on c.CustomerID= inv.fk_CustomerID
        Cross join (Select SUM(inc.ServicePrice) as TotalCost from dbo.Invoices inc as TotalCost) t
        where Convert(varchar(11), inv.EntryDateTime, 106) between @FromDate and @ToDate



END

Обновление:

**

Msg 156, Level 15, State 1, Procedure ServicesDetailedReport, Line 23
    Incorrect syntax near the keyword 'as'.

**

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Вы дважды используете псевдоним, а затем используете первый псевдоним
Исправлено:

(Select SUM(inc.ServicePrice) as TotalCost from dbo.Invoices inc)
0 голосов
/ 22 мая 2018

Просто удалите 'AS', используемый в 'как TotalCost' в перекрестном соединении

  Select inv.InvoiceNo, inv.EntryDateTime, s.ServiceName, c.VehicleRegNo, inv.ServicePrice, c.CustomerName, inv.fk_BookingID
    from dbo.[Services] s
    inner join invoices inv
    on inv.fk_ServiceID= s.ServiceID
    inner join customers c
    on c.CustomerID= inv.fk_CustomerID
    Cross join (Select SUM(inc.ServicePrice) as TotalCost from dbo.Invoices inc ) t
    where Convert(varchar(11), inv.EntryDateTime, 106) between @FromDate and @ToDate
0 голосов
/ 22 мая 2018

Это ваша проблема:

from dbo.Invoices inc as TotalCost

SQL Server будет неявно псевдоним вашей таблицы без ключевого слова AS.Таким образом, ваш запрос фактически обрабатывается следующим образом:

from dbo.Invoices AS inc AS TotalCost
                  ^      ^
                  |      |
                  |      |
                  |      |

По сути, вы дважды псевдоним своей таблицы, и это неверный синтаксис.

Так что это будет обновленный и правильный код процедуры:

ALTER PROCEDURE dbo.ServicesDetailedReport
    @FromDate DATE = '01-Jun-2010',
    @ToDate DATE = NULL
AS
BEGIN
    SET @ToDate = ISNULL(@ToDate, GETDATE());

    SELECT inv.InvoiceNo, inv.EntryDateTime, s.ServiceName, c.VehicleRegNo, inv.ServicePrice, c.CustomerName, inv.fk_BookingID
    FROM dbo.services AS s
    INNER JOIN invoices AS inv
        ON inv.fk_ServiceID = s.ServiceID
    INNER JOIN customers AS c
        ON c.CustomerID = inv.fk_CustomerID
    CROSS JOIN (   SELECT SUM(inc.ServicePrice) AS TotalCost
                   FROM dbo.Invoices AS inc) AS t
    WHERE inv.EntryDateTime BETWEEN @FromDate AND @ToDate;
END;

Также обратите внимание, что я заменил вашу инструкцию case на простой ISNULL() и удалил лишние операторы преобразования в вашем запросе, они не нужны.

...