如何查询T-SQL以获得每个'y'的“前10'x'

时间:2013-06-25 18:06:12

标签: sql-server tsql reporting-services

好的,我发现了一些我正在尝试做的事情,但是给出的例子和答案对我来说太简单了,或者太复杂了我无法理解。我不是一个专业的DBA,只是一个贫穷的网络技术人员,他必须在Visual Studio 2012中为销售部门撰写报告,所以请善待。

基本上,我需要在报表设计器中编写一个来自2个表的查询 - 'custextract'和'histextract'。结果是30个字段长(报告中需要所有这些字段,所以我学会了很快,不要尝试在查询中进行分组)。

最终报告必须为销售人员创建一个“客户联系页面” - 每个客户一页。顶部是基本客户信息,完全来自客户表,下部是按产品线列出的销售历史信息表(按期至今,年初至今,去年等)。大约有30种可能的产品系列,但大多数客户只购买少数产品。报告应该只返回每个客户的TOP(10)行ORDERED BY年初至今的DESC - 如果这是有道理的。我到目前为止的查询是:

SELECT custextract.*, histextract.*
FROM custextract 
INNER JOIN histextract 
        ON custextract.[cusx-cust-no] = histextract.[hisx-cust]
WHERE (custextract.[cusx-ecall-select] = 'Y')
ORDER BY histextract.[hisx-sales-ytd] DESC

显而易见的问题是,如果我在SELECT中包含TOP(10),我只获得前10名,而不是每位客户。我假设我需要选择一个Count(histextract。[hisx-cust])AS号,然后根据数字做一些迭代循环,加入所有结果 - 但我完全失去了如何有效地完成这个。 Select,From,Where,Order by,Into基本上是我查询技能的极限。

我正在使用存储过程从ISAM数据库的提取中填充这两个表作为.csv文件(我仍然没有弄清楚如何触发它,但是后来这个)。基本上只是一个TRUNCATE和BULK INSERT操作。但是,如果创建第三个表以保存已排序和过滤的数据并使用该更新过程继续并创建所需的数据集(然后在报表设计器中使用该第三个表),那么我是开放的 - 只是不知道怎么做。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

不是加入,但我认为你可以得到这个想法

WITH OrderedOrders AS
(
    SELECT SalesOrderID, Customer,
    ROW_NUMBER() OVER (Customer BY SalesOrderID) AS RowNumber
    FROM Sales.SalesOrderHeader 
) 
SELECT SalesOrderID, Customer  
FROM OrderedOrders 
WHERE RowNumber <= 10;

ROW_NUMBER (Transact-SQL)

OP需要的不仅仅是想法

WITH OrderedOrders AS
(
    SELECT custextract.[cusx-cust-no], histextract.[hisx-sales-ytd], 
           ROW_NUMBER() OVER (custextract.[cusx-cust-no] BY histextract.[hisx-sales-ytd] desc) AS RowNumber
    FROM custextract 
    INNER JOIN histextract 
        ON custextract.[cusx-cust-no] = histextract.[hisx-cust]
    WHERE (custextract.[cusx-ecall-select] = 'Y')
) 
SELECT OrderedOrders.[cusx-cust-no], OrderedOrders.[hisx-sales-ytd] 
FROM OrderedOrders 
WHERE RowNumber <= 10;