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 时,使用了一种称为聚合查询的常见功能,您可以在线找到相关教程
我在数据库中有一个 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 时,使用了一种称为聚合查询的常见功能,您可以在线找到相关教程