多行合而为一

时间:2018-08-01 19:52:51

标签: sql ms-access-2010

我正在使用MS Access 2010数据库,而为此付出的努力超出了预期。

我有这些表:

    tblBook:
    IDBook (key)
    Title

    tblUser:
    IDUser (key)
    Username

    tblOrder:
    IDOrder (key)
    IDUser (linked to tblUser)
    Date

    tblOrderBook:
    IDOrderBook (key)
    IDOrder (linked to tblOrder)
    IDBook (linked to tblBook)

每个订单用户最多可以提取3本书。我通过IDOrderBook进行了显示这样的查询:

IDOrderBook |IDOrder | Username | Date | Title

6           |3       | John     | Aug 1| Harry Potter
5           |3       | John     | Aug 1| Lord of the Rings
4           |2       | Susan    | Jul 5| The Shining
3           |2       | Susan    | Jul 5| Huck Finn
2           |2       | Susan    | Jul 5| Peter Pan
1           |1       | Rita     | Jul 4| Harry Potter

现在,我希望通过IDOrder向他们显示如下内容:

IDOrder | Username | Date | Title1       | Title2    | Title3

3       | John     | Aug 1| Harry Potter | LoTR      |
2       | Susan    | Jul 5| The Shining  | Huck Finn | Peter Pan 
1       | Rita     | Jul 4| Harry Potter |           | 

因此一行中有多个标题。如何建立此查询?

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一项艰巨的任务。首先,我们创建列名称。我们通过对ID高于当前ID的每条记录进行计数来实现。然后,我们旋转该列名,创建t

我将基于您共享的所有查询作为所有这些查询的基础。我们称它为qry1。

创建列名称qry2的查询:

SELECT IDOrderBook, IDOrder, Username, Date, Title, 
    "Title" & (
        SELECT Count(*) 
        FROM qry1 s 
        WHERE q.IDOrder = s.IDOrder AND q.IDOrderBook >= s.IDOrderBook
    ) As ColumnName
FROM qry1 q

然后,我们使用数据透视表(交叉表)查询创建所需的结果:

TRANSFORM First(Title)
SELECT IDOrder, Username, Date
FROM qry2
GROUP BY IDOrder, Username, Date
Pivot ColumnName

对于读者来说,我将使用子查询合并这些查询作为练习,为了清楚起见,我将它们拆分。