【问题标题】:how to get multiple columns values in one row with ms access query如何使用 ms 访问查询在一行中获取多个列值
【发布时间】:2014-12-09 11:58:54
【问题描述】:

我正在为我的公司开发 Access DB,我有一个包含这些列的表:

共同命名项目名称 Date1 Date2 Date3 Date4 Date5 Date6 Date7 Date8 Payment1 Payment2 Payment3 Payment4 Payment5 Payment6 Payment7 Payment8 Deatil1 Deatil2 Deatil3 Deatil4 Deatil5 Deatil6 Deatil7 Deatil8

我想设计一个查询,包括以下列:

日期(用户可以输入范围) SUM [此期间支付的总和] 联名 项目名称

任何人都可以在这个查询中帮助我吗?

【问题讨论】:

    标签: sql ms-access vba ms-access-2010


    【解决方案1】:

    您的问题的答案是标准化。您当前的设置不会以任何可能的方式帮助您。相当复杂。

    你应该有行而不是列。所以 TOTALS 查询可以发挥它的魔力。设置应该是,

    Co-Name |   Project-Name    |   DateOfPay   |   Payment |   Details
    

    而不是这样设置,

    Co-Name |   ProjName    |   Date1   |   Payment1|   Detail1 |   Date2   |   Payment2|   Detail2 |   Date3   |   Payment3|   Detail3
    --------+---------------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-------------
    AAA     |   X-1         |22/05/2014 |   £ 500   |   First   |27/07/2014 |   £ 100   |   Second  |           |           |   
    BBB     |   Y-1         |02/08/2014 |   £ 300   |   First   |15/09/2014 |   £ 250   |   Second  |24/10/2014 |   £ 400   |   Third   
    CCC     |   X-1         |07/11/2014 |   £ 100   |   First   |           |           |           |           |           |
    

    你应该设置为,

    Co-Name |   Project-Name    |   DateOfPay   |   Payment |   Details
    --------+-------------------+---------------+-----------+-------------
    AAA     |   X-1             |   22/05/2014  |   £ 500   |   First
    AAA     |   X-1             |   27/07/2014  |   £ 100   |   Second
    BBB     |   Y-1             |   02/08/2014  |   £ 300   |   First
    BBB     |   Y-1             |   15/09/2014  |   £ 250   |   Second
    BBB     |   Y-1             |   24/10/2014  |   £ 400   |   Third
    CCC     |   Z-1             |   07/11/2014  |   £ 100   |   First   
    

    这样,您的代码将非常简单,

    SELECT 
        [Co-Name], 
        [Project-Name], 
        Sum(Payment) As TotalPaid
    FROM
        theProperTable
    WHERE
        DateOfPay BETWEEN [EnterTheStartDate:] And [EnterTheEndDate:]
    GROUP BY 
        [Co-Name],
        [Project-Name]
    

    【讨论】:

    • 感谢您的回复,但我无法添加日期,我想选择日期然后查找该日期的付款支出,您能否举例说明您上面的解释?
    • 您不必添加日期@MohammedALJakry,您只需要将多列变为一列。例如。如果您有项目 A,有 5 个日期列和 5 个金额列。对于项目 A,您必须将其更改为 5 行,其中包含日期和一个金额列。
    【解决方案2】:

    如果您无法更改表的结构,您可以通过创建返回“规范化”版本表的查询来伪造它。将此 SQL 保存为查询,命名为 ProjectsNormalized:

        (SELECT [Co-Name], [Project-Name], Date1 As DateOfPay, Payment1 As Payment, Detail1 As Details FROM Projects WHERE Date1 Is Not Null;)
            UNION ALL
        (SELECT [Co-Name], [Project-Name], Date2 As DateOfPay, Payment2 As Payment, Detail2 As Details FROM Projects WHERE Date2 Is Not Null;)
            UNION ALL
        (SELECT [Co-Name], [Project-Name], Date3 As DateOfPay, Payment3 As Payment, Detail3 As Details FROM Projects WHERE Date3 Is Not Null;)
            UNION ALL 
        (SELECT [Co-Name], [Project-Name], Date4 As DateOfPay, Payment4 As Payment, Detail4 As Details FROM Projects WHERE Date4 Is Not Null;);
    

    如果项目包含此数据:

    然后 ProjectsNormalized 会给你这个数据:

    现在您可以对 ProjectsNormalized 进行查询,就像它是一个表一样。

    注意:使用 UNION ALL 而不仅仅是 UNION 很重要,因为 UNION 会丢弃重复记录。如果您在同一天有两笔相等的付款且详细信息相同,则您希望同时报告这两笔。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 2021-01-27
      • 2021-12-27
      • 2014-01-13
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多