【问题标题】:Format table with SQL to put multiple entry on one row使用 SQL 格式化表格以将多个条目放在一行上
【发布时间】:2022-01-24 08:24:27
【问题描述】:

我目前正在开发一个 Access 数据库,我想进行一个查询,该查询可以将多行融合为一个,但将所有条目分隔在不同的列中。

我正在查询的表称为“每月”,用于每月的活动报告,并以这种方式制作:

project date turnover margin
0001 01/01/2021 10000 20%
0001 01/02/2021 10500 15%
0002 01/01/2021 8500 25%

我想知道有没有办法把它变成这样:

project date turnover margin date turnover margin
0001 01/01/2021 10000 20% 01/02/2021 10500 15%
0002 01/01/2021 8500 25% 01/02/2021

一开始想用GROUP BY,但显然不适应。

目标是根据 SQL 请求对其进行格式化,而不是修改结构/数据的存储方式。

提前感谢任何回答的人。

【问题讨论】:

标签: sql ms-access


【解决方案1】:

如果它不存在,请在表格中添加一个自动编号字段。

考虑:

查询1:

SELECT ID, project, [date] AS Data, "D" AS Cat FROM ProjectData
UNION SELECT ID, project, turnover, "T" FROM ProjectData
UNION SELECT ID, project, margin, "M" FROM ProjectData;

查询2:

TRANSFORM First(Query1.Data) AS FirstOfData
SELECT Query1.project
FROM Query1
GROUP BY Query1.project
PIVOT DCount("*","ProjectData","Project='" & [Project] & "' AND ID<" & [ID])+1 & [Cat];

假设这将是一个多年的数据库,因此可能需要一些过滤条件来将选择限制为一年。

类似的例子Pivot Query in MS Access

有关 CROSSTAB 查询的更多信息,请查看http://allenbrowne.com/ser-67.html

或模拟 CROSSTAB(例如 2 个月):

SELECT ProjectData.project, 
Max(IIf(Month([date])=1,[Date],Null)) AS Jan, Max(IIf(Month([date])=1,[Margin],Null)) AS JanMargin, Max(IIf(Month([date])=1,[turnover],Null)) AS JanTurnover, 
Max(IIf(Month([date])=2,[Date],Null)) AS Feb, Max(IIf(Month([date])=2,[Margin],Null)) AS FebMargin, Max(IIf(Month([date])=2,[turnover],Null)) AS FebTurnover
FROM ProjectData
GROUP BY ProjectData.project;

不应使用保留字作为名称。日期是保留字。

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2020-07-16
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    相关资源
    最近更新 更多