2013-10-09 34 views
0

假设一个名为交易表有两列:invoiceNumberitemNumber。表中的多个记录反映了单个发票上的多个项目的数量。 (我知道这是不是一个合适的设计,但我简化了更复杂的结构来获得在根的问题。)SQL Server的查询来进一步总结分组数据

我能确定的唯一项目的平均数量与像查询每一张发票:

SELECT invoiceNumber, COUNT(DISTINCT itemNumber) 
FROM transactions 
GROUP BY invoiceNumber 

此查询有效地忽略了一个项目的数量,每个发票只计算一次,并显示每个发票的结果。

而是这一切的详细信息,但是,我真正想要的是确定跨所有发票平均一些独特的项目。也就是说,我只想总结每张发票的信息。我怎么做?

+0

为什么使用'平均数'?也许你想说'唯一号码'? –

回答

1

您可以汇总已经知道如何获得的结果。

WITH DistinctCounts AS (
    SELECT invoiceNumber, COUNT(DISTINCT itemNumber) AS distinctItems 
    FROM transactions 
    GROUP BY invoiceNumber 
) 
    SELECT AVG(distinctItems) 
    FROM DistinctCounts 
+0

工作正常,但我不得不在查询的开头添加分号以避免语法错误 – jalperin

+1

谢谢。准确地说,您必须添加的分号是前一个查询的终结符,而不是此查询的一部分。如果你单独运行这个查询,没有分号就没问题。 :) –

+0

我正在通过一个3D聚会网络应用程序的界面运行查询,并且显然我运行的不止一个查询,因此弄清楚这一点令人费解。 ;-)顺便说一句,我在这里找到了一个非常类似的答案:http://technet.microsoft.com/en-us/library/ms175972.aspx“B.使用公用表表达式来限制计数和报告平均值” – jalperin

0
Select avg(numberininvoice) 
From 
(
Select invoicenumber, count(itemnumber) as numberininvoie 
From 
(Select distinct invoicenumber, itemnumber 
From transactions) a 
Group by invoicenumber 
) b