2015-06-24 61 views
1

我试图展示TOP 5销售量最高的品牌。我目前只有4个品牌,因此产出表只显示4排品牌及其细节。我希望输出表显示在这种情况下为空的第五行。如何修改我的代码以实现我想要的功能?SQL Server:显示空行选择TOP 5

这是我的SQL语句:

SELECT TOP 5 
    ROW_NUMBER() OVER (ORDER BY ISNULL(SUM(Product.NoSold), 0) DESC) AS No, 
    Brand.BrandName, 
    ISNULL(SUM(Product.NoSold), 0) AS NoSold 
FROM 
    Brand 
LEFT OUTER JOIN 
    Product ON Brand.BrandId = Product.BrandId 
GROUP BY  
    Brand.BrandName 
ORDER BY  
    NoSold desc 
+1

'TOP N'无效MySQL中,也不是'OVER()'。你真的使用MS SQL Server吗?如果你尝试在MySQL中这样做,它将是一个语法错误。 –

+0

@MichaelBerkowski感谢您纠正我。是的我使用MS SQL。我改变了这一点。 – ExPlOiD

+2

什么版本的SQL Server?你是什​​么意思的空行?所有列为空?你为什么需要这个?看起来像是应该在表示层中完成的事情。 –

回答

2

您可以使用一个Tally Tabel并对您的真实查询执行LEFT连接。

SELECT 
    no.Number as no, 
    v.BrandName, 
    COALESCE(v.NoSold,0) NoSold 
FROM 

    master..spt_values no 
    LEFT JOIN 
    (
     SELECT TOP 5 ROW_NUMBER() over (ORDER BY ISNULL(SUM(Product.NoSold), 0) DESC) AS No, 
        Brand.BrandName, 
       ISNULL(SUM(Product.NoSold), 0) AS NoSold 
     FROM   Brand LEFT OUTER JOIN 
       Product ON Brand.BrandId = Product.BrandId 
     GROUP BY  Brand.BrandName 
     ORDER BY  NoSold desc 
    ) v 
    ON no.Number = v.No 
WHERE 
    no.Type = 'P' 
    AND no.Number between 1 and 5 

Demo with simplified inner query

0

我想你可以制造一些随机行,联合在一起与你的真实数据,然后用外TOP限制截断集。还可以添加伪造订单,以确保您的实际数据取代制造的数据。

SELECT TOP 5 No, BrandName, NoSold 
FROM 
(
    -- Your real query 
    SELECT 
     ROW_NUMBER() OVER (ORDER BY ISNULL(SUM(Product.NoSold), 0) DESC) AS No, 
     Brand.BrandName, 
     ISNULL(SUM(Product.NoSold), 0) AS NoSold, 
     1 AS OrderBy 
    FROM   
     Brand LEFT OUTER JOIN 
     Product ON Brand.BrandId = Product.BrandId 
    GROUP BY 
     Brand.BrandName 

    UNION ALL 

    -- Manufactured data. 
    SELECT NULL AS No, NULL AS BrandName, NULL AS NoSold, 0 AS OrderBy 
    FROM sys.objects 
) X 
ORDER BY OrderBy DESC, NoSold DESC; 

Fiddle here

然而,这对我来说似乎是一个表现层更好的工作 - 例如如果屏幕上确实存在5个硬编码插槽,则可能需要对缺少的数据进行窗口装饰,例如“即将推出的新品牌”等。

+0

'FROM sys.objects'这是故意的还是测试代码? – Khan

+0

选择任何保证存在的表至少5行。我们没有从中选择。或者使用数字模式。 – StuartLC

+0

在内存中创建表格会更有意义吗? – Khan

0
select top 5 * from (select * from (values(null),(null),(null),(null),(null)) as Category(nil)) a 
left join Brand on 1=1 
LEFT OUTER JOIN 
      Product ON Brand.BrandId = Product.BrandId 
GROUP BY  Brand.BrandName 
ORDER BY  NoSold desc