多个选择

时间:2015-07-19 12:42:03

标签: sql sql-server sql-server-2012

我有一个查询,选择所有汽车制造并计算每个制造数量作为回应

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,Level 16,State 1,Line 10
  当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式。

如何编写正确的语法?

1 个答案:

答案 0 :(得分: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;