Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如何返回一个列,该列是另一列上返回的行的集合?_Sql - Fatal编程技术网

SQL:如何返回一个列,该列是另一列上返回的行的集合?

SQL:如何返回一个列,该列是另一列上返回的行的集合?,sql,Sql,我有一张公司和发票的表格。我的查询将每个公司发票的总值相加,以提供公司的“总销售额”。我想返回的是与同一查询中的其他公司相比,每个公司销售额的+/- Select Company.name, sum(Invoice.total) as InvoiceTotal From Company Inner Join Invoice on Invoice.CompanyId = Company.Id Group By Company.name 假设上述查询生成: Company Inv

我有一张公司和发票的表格。我的查询将每个公司发票的总值相加,以提供公司的“总销售额”。我想返回的是与同一查询中的其他公司相比,每个公司销售额的+/-

Select Company.name, sum(Invoice.total) as InvoiceTotal
From Company
Inner Join Invoice on Invoice.CompanyId = Company.Id
Group By Company.name
假设上述查询生成:

Company          InvoiceTotal
A                100
B                200
C                600
我希望附加列提供超过或低于InvoiceTotal列平均值的金额:

Company          InvoiceTotal    Difference
A                100             -200
B                200             -100
C                600             300

如何在单个查询中提取该值?

如果您的数据库可以处理窗口平均值(大多数都可以),则可以使用应用于发票总额的窗口平均值函数,然后使用发票总额执行其余操作

这是SQL Server的一个示例:

;WITH Data AS
(
    SELECT
        *
    FROM
        (
        VALUES
            ('a', 50),
            ('a', 25),
            ('a', 25),

            ('b', 125),
            ('b', 75),

            ('c', 275),
            ('c', 50),
            ('c', 75),
            ('c', 200)) V(Company, Invoice)
)
SELECT
    Company = V.Company,
    Invoice = SUM(V.Invoice),
    AverageAcrossAllCompanies = AVG(SUM(V.Invoice)) OVER (),
    AverageInvoiceDifference = SUM(V.Invoice) - AVG(SUM(V.Invoice)) OVER ()
FROM
    Data AS V
GROUP BY
    V.Company
结果:

Company Invoice AverageAcrossAllCompanies   AverageInvoiceDifference
a       100     300                         -200
b       200     300                         -100
c       600     300                         300

假设您的数据库支持CTE

with total as (
    select avg(invoicetotal) totalsum
from table_name)
    select t.company, 
           t.invoicetotal, 
           t.invoicetotal - total.totalsum
from table_name t, total

Company INVOICETOTAL    T.INVOICETOTAL-TOTAL.TOTALSUM
A        100            -200
B        200            -100
C        600             300

这里有另一种方法可以得到你想要的方差

Select
    name,
    InvoiceTotal,
    InvoiceTotal - avg(InvoiceTotal) as Difference
From
    (Select Company.name, sum(Invoice.total) as InvoiceTotal
    From Company
    Inner Join Invoice on Invoice.CompanyId = Company.Id
    Group By Company.name)
group by name, InvoiceTotal

可通过以下查询获得结果:

Select Company.company, sum(Invoice.total) as InvoiceTotal, (SELECT AVG(Invoice.total) FROM Invoice) AS InvoiceAvg,(SELECT AVG(Invoice.total) FROM Invoice) -sum(Invoice.total) AS Difference
From Company
Inner Join Invoice on Invoice.CompanyId = Company.Id
Group By Company.company

您正在使用哪个数据库管理系统?@Tanner Snowflake