Select 基于单列的多个条件的多列

Select multiple columns based on multiple conditions from single column

我在数据库中有一个 table,它存储金额、它们各自的“发票日期”以及这些发票日期所在的合同年份。

有年度、半年度、季度和月度合同的客户。因此一年期间可以有多个发票 - 因此该列定义了发票属于哪一年。

看起来类似于:

ContractID InvoiceNumber InvoiceDate Amount YearIndex
1 1 01/01/2019 100 1
1 2 01/06/2019 100 1
1 3 01/01/2020 100 2
1 4 01/06/2020 100 2
2 1 01/03/2020 200 1
2 2 01/03/2020 200 2
2 3 01/03/2021 200 3
3 1 01/01/2020 300 1
3 2 01/04/2020 300 1
3 3 01/07/2020 300 1
3 4 01/10/2020 300 1

理想情况下,我想运行一个查询,我可以在其中看到每份合同金额的总和,按年份索引分组,例如

ContractID Year1Amount Year2Amount Year3Amount
1 200 200 NULL
2 200 200 200
3 1200 NULL NULL

这可以通过单个查询实现吗?或者这需要加入多个吗?

关于可用语法,我正在使用 Microsoft Access。

提前感谢您的帮助。

这是一般模式。您可以根据需要切换 Access 和 Null 与 0 的语法。

SELECT ContractID,
       SUM(CASE WHEN YearIndex = 1 THEN Amount ELSE 0 END) AS Year1Amount,
       SUM(CASE WHEN YearIndex = 2 THEN Amount ELSE 0 END) AS Year2Amount,
       ...
       SUM(CASE WHEN YearIndex = N THEN Amount ELSE 0 END) AS YearNAmount
  FROM SOME_TABLE
 GROUP
    BY ContactID

只是想补充一点,Microsoft Access 不支持 CASE 语句,只支持 IIF 语句,但是,IIF 语句不允许在其中使用聚合函数。所以答案最终是访问以下内容:

SELECT 
    DISTINCT (ContractInvoiceInfo.ContractID), 
    Y1.Y1Amount, 
    Y2.Y2Amount, 
    Y3.Y3Amount, 
    Y4.Y4Amount, 
    Y5.Y5Amount

FROM 
    ContractInvoiceInfo INNER JOIN (
        (   
            SELECT ContractID, SUM(Amount) AS Y1Amount 
            FROM ContractInvoiceInfo 
            WHERE YearIndex = 1 
            GROUP BY ContractID
        )  AS Y1 LEFT JOIN (
            (   
                SELECT ContractID, SUM(Amount) AS Y2Amount 
                FROM ContractInvoiceInfo 
                WHERE YearIndex = 2 
                GROUP BY ContractID
            )  AS Y2 LEFT JOIN (
                (
                    SELECT ContractID, SUM(Amount) AS Y3Amount 
                    FROM ContractInvoiceInfo 
                    WHERE YearIndex = 3 
                    GROUP BY ContractID
                )  AS Y3 LEFT JOIN (
                    (
                        SELECT ContractID, SUM(Amount) AS Y4Amount 
                        FROM ContractInvoiceInfo 
                        WHERE YearIndex = 4 
                        GROUP BY ContractID
                    )  AS Y4 LEFT JOIN (
                            SELECT ContractID, SUM(Amount) AS Y5Amount 
                            FROM ContractInvoiceInfo 
                            WHERE YearIndex = 5 
                            GROUP BY ContractID
                            )  AS Y5 
                        ON Y5.ContractID = Y4.ContractID)
                    ON Y4.ContractID = Y3.ContractID)
                ON Y3.ContractID = Y2.ContractID)
            ON Y2.ContractID = Y1.ContractID)
        ON Y1.ContractID = ContractInvoiceInfo.ContractID

ORDER BY 
ContractInvoiceInfo.ContractID;

数据库不想在并排显示中为您提供总和...您将创建很多复杂性来实现这一点

现成的是:

groupID groupYear sumAmount

特别是使用 Access 时,使用了一种称为聚合查询的常见功能,您可以在线找到相关教程