如何根据group by执行一次子查询

问题描述 投票:0回答:1

我在 Dynamics 365 SQL Server 数据库中有一个大型查询,但遇到问题。

我尝试在此处的一个小查询中重现该问题:

CREATE TABLE Persons 
(
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
);

CREATE TABLE invoices 
(
    PersonID int,
    InvoiceId int,
);

INSERT INTO Persons (PersonID, LastName, FirstName) 
VALUES (1, 'test', 'test')

INSERT INTO invoices (PersonID, InvoiceId) VALUES (1, 1)
INSERT INTO invoices (PersonID, InvoiceId) VALUES (1, 2)
INSERT INTO invoices (PersonID, InvoiceId) VALUES (1, 3)
INSERT INTO invoices (PersonID, InvoiceId) VALUES (1, 4)
INSERT INTO invoices (PersonID, InvoiceId) VALUES (1, 5)

SELECT
    p.PersonID,
    SUM(s1.number)
FROM
    Persons p
-- INNER JOIN invoices i ON i.PersonID = p.PersonID
LEFT OUTER JOIN
    (SELECT 5 AS number) AS s1 ON number > 1
GROUP BY 
    p.PersonID


SELECT
    p.PersonID ,
    SUM(s1.number)
FROM
    Persons p
INNER JOIN
    invoices i ON i.PersonID = p.PersonID
LEFT OUTER JOIN
    (SELECT 5 AS number) AS s1 ON number > 1
GROUP BY 
    p.PersonID

运行查询我得到这个结果:

因此,如果我对发票也进行内部联接,它将使得 子查询到

left outer join (select 5 as number) as s1
乘以发票金额,然后按 PersonId 分组并求和 在
s1.number
上,它将是
sum(s1.number)
* 发票金额, 如果有人可以帮助我如何避免这种情况,并且如果我进行内部联接和子查询并进行分组依据,则应该只根据分组依据从子查询中获取结果一次

我无法使用任何临时表解决方案,因为它在 Dynamics 中受到限制

sql-server dynamics-crm dataverse
1个回答
0
投票

在按 PersonID 分组的子查询中进行基于发票的计算,然后加入该子查询:

SELECT
    p.PersonID ,
    SUM(s1.number)
FROM     Persons p
INNER JOIN     invoices i ON i.PersonID = p.PersonID
CROSS JOIN (SELECT 5 AS number) AS s1
GROUP BY 
    p.PersonID
人员ID (无栏名)
1 25
SELECT
    p.PersonID ,
    s1.number
FROM     Persons p
INNER JOIN  (
      /* do the calculations here */
      select PersonID
      from invoices 
      group by PersonID
      ) AS i ON i.PersonID = p.PersonID
CROSS JOIN (SELECT 5 AS number) AS s1
人员ID 数字
1 5

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.