Ms access SQL语句与CASE连接

Ms access SQL语句与CASE连接,ms-access,Ms Access,我对下面的3个表有问题,从MS ACCESS开始执行“SQL CASE IF ELSE”,我不知道如何开始 表A(注册) 表B(每月付款和其他) 表C(学生名单) 结果: Name | Year | Class | Jan&Nov | Pay Feb | Pay Mac | Pay Apr NameA | 2015 | A | 100.00 | 100.00 | 100.00 | 000.00 NameB | 2015 | B

我对下面的3个表有问题,从MS ACCESS开始执行“SQL CASE IF ELSE”,我不知道如何开始

表A(注册)

表B(每月付款和其他)

表C(学生名单)

结果:

Name    | Year  | Class | Jan&Nov   | Pay Feb   | Pay Mac   | Pay Apr
NameA   | 2015  | A     | 100.00    | 100.00    | 100.00    | 000.00
NameB   | 2015  | B     | 100.00    | 100.00    | 100.00    | 100.00
我需要根据这3个表的数据创建“1月和11月付款”、“2月付款”和“10月付款”字段。如果数据不存在,我需要将其格式化为“00.00”或“未付款”


我希望任何有解决方案的人都能帮助我。我是新的SQL语句实际上

这里是直接的解决方案,首先使用子查询而不是聚合和案例构造。(我使用NZ在NULL的情况下返回0。这将在标准SQL中合并)

连接、聚合和IIF也是如此(在标准SQL中也是如此):

(您可能需要,也可能不需要在连接周围附加括号。我想我记得MS Access在连接语法方面相当独特。)

至于以某种格式显示数字:这是您通常在GUI层中执行的操作。使用SQL进行格式化时,必须将数字转换为字符串,例如,将20转换为“20.00”。在MS Access中,您可以使用以下格式执行此操作:

format (value, 'Standard')
对于第二个查询:

format(nz(max(iif(m.desc = 'PAY FEB', m.amount end, null)), 0), 'Standard')
如果为空,则显示“0.00”。或:

nz(format(max(iif(m.desc = 'PAY FEB', m.amount, null)), 'Standard'), 'NOT PAID')

如果为空,则显示“未支付”。

这是一个直截了当的解决方案,使用子查询而不是聚合和案例构造。(我使用NZ在NULL的情况下返回0。这将在标准SQL中合并)

连接、聚合和IIF也是如此(在标准SQL中也是如此):

(您可能需要,也可能不需要在连接周围附加括号。我想我记得MS Access在连接语法方面相当独特。)

至于以某种格式显示数字:这是您通常在GUI层中执行的操作。使用SQL进行格式化时,必须将数字转换为字符串,例如,将20转换为“20.00”。在MS Access中,您可以使用以下格式执行此操作:

format (value, 'Standard')
对于第二个查询:

format(nz(max(iif(m.desc = 'PAY FEB', m.amount end, null)), 0), 'Standard')
如果为空,则显示“0.00”。或:

nz(format(max(iif(m.desc = 'PAY FEB', m.amount, null)), 'Standard'), 'NOT PAID')

如果为空,则显示“未支付”。

从问题中不太清楚
TableA
TableB
是如何关联的,但看起来您需要一个
UNION ALL
查询,并且要排除某些类别:

SELECT
  c.Name,
  c.Year,
  c.Class,
  ab.Desc,
  ab.Amount
FROM
  TableC AS C INNER JOIN (
    SELECT * FROM TableA WHERE Desc NOT IN ('BOOKS', 'UNIFORM', 'OTHERS')
    UNION ALL
    SELECT * FROM TableB WHERE Desc NOT IN ('BOOKS', 'UNIFORM', 'OTHERS')
  ) AS ab
  ON c.Name = ab.Name AND c.Year = ab.Year
然后,可以将上一个查询作为子查询使用透视:

TRANSFORM Sum(Amount) AS SumOfAmount
SELECT Name, Year, Class, Sum(Amount) AS [Sum_Amount]
FROM (

  ...the query above...

) AS s
GROUP BY Name, Year, Class
PIVOT Desc;

从问题中不太清楚
TableA
TableB
是如何相互关联的,但看起来您需要一个
UNION ALL
查询,并且要排除一些类别:

SELECT
  c.Name,
  c.Year,
  c.Class,
  ab.Desc,
  ab.Amount
FROM
  TableC AS C INNER JOIN (
    SELECT * FROM TableA WHERE Desc NOT IN ('BOOKS', 'UNIFORM', 'OTHERS')
    UNION ALL
    SELECT * FROM TableB WHERE Desc NOT IN ('BOOKS', 'UNIFORM', 'OTHERS')
  ) AS ab
  ON c.Name = ab.Name AND c.Year = ab.Year
然后,可以将上一个查询作为子查询使用透视:

TRANSFORM Sum(Amount) AS SumOfAmount
SELECT Name, Year, Class, Sum(Amount) AS [Sum_Amount]
FROM (

  ...the query above...

) AS s
GROUP BY Name, Year, Class
PIVOT Desc;

谢谢你给了我一个正确的方向。由于在MS Access IDE上直接使用您的解决方案尝试了很多天,我终于找到了一个窍门。我要非常感谢你解决了我的问题。诀窍是:

A) 如果记录为空或通过选择存在,则使用(选择Nz(最大金额),“未支付”)作为PAYFEB

所有类型的解决方案,如左连接或直接子查询,实际上都在工作。但我更喜欢子查询,因为它更易于组织,我可以看到是否有语法或字段未注册


最后,没有你们的支持,我无法得到这个问题的答案。非常感谢你们。

感谢fthiella、DeadZone、Beth和Thorsten Kettner,他们给了我一个正确的方向。由于在MS Access IDE上尝试了很多天,我终于找到了一个窍门。我需要非常感谢你们解决了我的问题诀窍是:-

A) 如果记录为空或通过选择存在,则使用(选择Nz(最大金额),“未支付”)作为PAYFEB

所有类型的解决方案,如左连接或直接子查询,实际上都在工作。但我更喜欢子查询,因为它更易于组织,我可以看到是否有语法或字段未注册


最后,没有你们的支持,我无法得到这个问题的答案。非常感谢各位。

不清楚如何准确地
连接
表A和表B。应该做的第一件事是清理您的表设计。如果您使用实际日期而不是人类解释为月名的字符串,您会发现您的查询是错误的更容易构建。但为了让您走上正确的道路,您似乎希望使用
Desc
列中的值作为列标题。这可以通过a来实现。nameB的payFeb应该是$0?我认为您希望
联合表a和表B,然后与表C连接,然后创建交叉表查询。非常感谢您的支持我们对此事的评论和时间(DeadZone和Beth)。对此我非常感激。不清楚如何准确地
连接
表A和表B。应该做的第一件事是清理您的表设计。如果您使用实际日期,而不是人类解释为月份名称的字符串,您会发现您的查询更容易构建。但要确定正确的路径,您似乎需要想要使用
Desc
列中的值作为列标题。这可以通过a来实现。nameB的payFeb应该是$0?我想你想要
UNION
表a和表B,然后与表C连接,然后创建一个交叉表查询。非常感谢你的评论和查看此问题的时间(DeadZone和Beth)。我非常感谢。感谢Thorsten Kettner抽出时间帮助我。我将尝试你的解决方案,并让你的所有人知道结果。你的解决方案有效,但我如何显示“未付款”如果金额为空或为null或未找到记录选择。根据上述解决方案,PAY FEB仅在记录为空时显示金额,否则字段为空。我已经尝试了许多语句,如:-Select IIF(m.bayaran,0,'not PAID')-仍然不工作。请告诉我如何克服此问题。这是一个显示问题。我的查询不关心如何显示数字。Wh