2015-07-19 4 views
0

У меня есть запрос, который выбрать все автомобиль делает и рассчитывать каждый делает количество в ответSQL Server с несколькими выберите

SELECT 
    q.Make, Count(q.ID) 
FROM 
    (SELECT 
     cars.ID, cars.Make, cars.Model, 
     cars.Year1, cars.Month1, cars.KM, cars.VIN, 
     cars.Fuel, cars.EngineCap, cars.PowerKW, 
     cars.GearBox, cars.BodyType, cars.BodyColor, 
     cars.Doors, cars.FullName, Transport.address, 
     (DateDiff(second,Getdate(),cars.AuEnd)) as r, 
     cars.AuEnd, cars.BuyNowPrice, cars.CurrentPrice 
    FROM 
     cars 
    LEFT JOIN 
     Transport ON Cars.TransportFrom = Transport.ID 
    WHERE 
     Active = 'True' 
     AND AuEnd > GETDATE() 
     AND year1 >= 1900 AND year1 <= 2015 
     AND Make in ('AUDi', 'AIXAM', 'ALPINA') 
    ORDER BY 
     cars.make ASC, cars.model ASC 
     OFFSET 50 ROWS FETCH NEXT 50 ROWS ONLY) AS q 
GROUP BY 
    q.make ORDER BY q.make ASC; 

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

Make CountInResponse 
AIXAM 1     
ALPINA 1     
AUDI 48     

Но мне нужно, чтобы получить

Make CountInResponse Total 
AIXAM 1     1 
ALPINA 1     1 
AUDI 48    100 

Я думаю, что нужно что-то вроде

SELECT 
    q.Make, Count(q.ID), 
    (SELECT Make, Count(ID) 
    FROM cars 
    WHERE Active = 'True' AND AuEnd > GETDATE() 
     AND year1 >= 1900 AND year1 <= 2015 
     AND Make in ('AUDI', 'AIXAM', 'ALPINA') 
    GROUP BY Make) as q2 
FROM 
    (SELECT    
     cars.ID, cars.Make, cars.Model, 
     cars.Year1, cars.Month1, cars.KM, cars.VIN, 
     cars.Fuel, cars.EngineCap, cars.PowerKW, 
     cars.GearBox, cars.BodyType, cars.BodyColor, 
     cars.Doors, cars.FullName, Transport.address, 
     (DateDiff(second,Getdate(),cars.AuEnd)) as r, 
     cars.AuEnd, cars.BuyNowPrice, cars.CurrentPrice 
    FROM 
     cars 
    LEFT JOIN 
     Transport ON Cars.TransportFrom = Transport.ID 
    WHERE 
     Active = 'True' 
     AND AuEnd > GETDATE() 
     AND year1 >= 1900 AND year1 <= 2015 
     AND Make in ('AUDi', 'AIXAM', 'ALPINA') 
    ORDER BY 
     cars.make ASC, cars.model ASC 
     OFFSET 50 ROWS FETCH NEXT 50 ROWS ONLY) AS q 

Но я получаю ошибку

Msg 116, уровень 16, состояние 1, строка 10
Только одно выражение можно указать в списке выбора, когда подзапрос не вводится с EXISTS.

Как написать правильный синтаксис?

+0

Прежде всего, необходимо сказать, что значение, которое вы должны показать в 'q2'. Вы выбираете два столбца в 'q2' (т.е.)' Make, Count (ID) 'вы не можете сделать это в' sql server' –

+0

Fisrt Count для смещенного запроса второго для общего количества без смещения –

ответ

2

Проблема заключается в том, что вы выбираете два столбца в q2 (т.е.) Make, Count(ID) вы не можете сделать это на SQL Server.

Попробуйте что-нибудь подобное.

WITH cte AS 
( 
    SELECT  
     row_number() OVER(order by cars.make ASC,cars.model ASC) AS rn, 
     cars.id, cars.make 
    FROM  
     cars 
    LEFT JOIN 
     transport ON cars.transportfrom = transport.id 
    WHERE  
     active = 'True' 
     AND auend > getdate() 
     AND year1 >= 1900 AND year1 <= 2015 
     AND make IN ('AUDI', 'AIXAM', 'ALPINA') 
) 
SELECT 
    make , 
    count(CASE WHEN RN BETWEEN 50 AND 100 THEN 1 END) AS countinresponse, 
    count(1) AS total 
FROM 
    cte 
GROUP BY 
    make 

Или вам нужно преобразовать sub-query в select к correlated sub-query

SELECT q.make, 
     Count(q.id) countinresponse, 
     ( 
        SELECT Count(id) 
        FROM  cars C1 
        WHERE c1.id = q.id 
        AND  active='True' 
        AND  auend > Getdate() 
        AND  year1 >= 1900 
        AND  year1 <= 2015 
        AND  make IN ('AUDi', 
            'AIXAM', 
            'ALPINA') 
        GROUP BY make) AS total 
FROM  ( 
        SELECT cars.id, 
          cars.make 
        FROM  cars 
        LEFT JOIN transport 
        ON  cars.transportfrom=transport.id 
        WHERE  active='True' 
        AND  auend > Getdate() 
        AND  year1 >= 1900 
        AND  year1 <= 2015 
        AND  make IN ('AUDi', 
             'AIXAM', 
             'ALPINA') 
        ORDER BY cars.make ASC, 
          cars.model ASC offset 50 rowsfetch next 50 rows only) AS q 
GROUP BY q.make 
ORDER BY q.make ASC; 
+0

Вы уверены, что он использует 2012? –

+0

Msg 8120, уровень 16, состояние 1, строка 6 Столбец «q.id» недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. –

+0

@RoyiNamir - Да, потому что он использует его в своем запросе, и ошибка не о 'offset', поэтому я думаю, что его '2012' –

Смежные вопросы