【问题标题】:MS Access Transform Query to MySQL QueryMS Access 将查询转换为 MySQL 查询
【发布时间】:2019-11-17 12:03:20
【问题描述】:

我正在将一个 MS Access 数据库迁移到 MySQL,但我遇到了一些查询的问题。

我已经完成了大约 80% 的查询传输,但是这个特殊的查询给我带来了麻烦。

TRANSFORM Nz(Max(IIf([charge_description_code] In ('AHS','AHW','AHL','RES','SAT'),"Y","N")), "N") AS Data
SELECT shipment_details.tracking_number, shipment_details.invoice_number
FROM shipment_details
WHERE tracking_number is not null
and charge_category_detail_code not in ('RADJ')
GROUP BY shipment_details.tracking_number, shipment_details.invoice_number
PIVOT shipment_details.charge_description_code In (SAT,AHW,AHS,AHL,RES);

我希望结果显示如下:

tracking_number invoice_number  SAT AHW AHS AHL RES
1Z2XXXXXXXXX625816  1329102975  N   N   N   N   N
1Z3YYYYYYYYY610514  1329109647  N   N   Y   N   N
1Z3ZZZZZZZZZ142605  1329109647  N   N   N   Y   Y

【问题讨论】:

标签: mysql sql ms-access pivot


【解决方案1】:

考虑在 MS Access 中仍然可以工作的条件聚合(将下面的 IF 替换为 IIF)。通常,与当前版本的五个不同,Access 的交叉表查询适用于多个透视列。此外,您的NZ 是多余的,因为NULL 根据条件逻辑解析为N

SELECT s.tracking_number, 
       s.invoice_number,
       MAX(IF(s.[charge_description_code] = 'SAT', 'Y', 'N')) AS 'SAT',
       MAX(IF(s.[charge_description_code] = 'AHW', 'Y', 'N')) AS 'AHW',
       MAX(IF(s.[charge_description_code] = 'AHL', 'Y', 'N')) AS 'AHL',
       MAX(IF(s.[charge_description_code] = 'AHS', 'Y', 'N')) AS 'AHS',
       MAX(IF(s.[charge_description_code] = 'RES', 'Y', 'N')) AS 'SAT'

FROM shipment_details s
WHERE s.tracking_number IS NOT NULL
  AND s.charge_category_detail_code NOT IN ('RADJ')
  AND s.charge_description_code IN ('AHS','AHW','AHL','RES','SAT')

GROUP BY s.tracking_number, 
         s.invoice_number

【讨论】:

  • 非常感谢Parfait的回复!我不得不删除 [charge_description_code] 周围的括号,然后查询运行,但它有点偏离。如果不满足条件,我想为所有字段(SAT、AHW、AHL、AHS、RES)返回 N。目前,由于 AND s.charge_description_code IN ('AHS','AHW','AHL','RES','SAT') 条件,这些行被排除在外。
  • 忽略之前的评论——我刚刚删除了 AND s.charge_description_code IN ('AHS','AHW','AHL','RES','SAT') 这就是我需要的。再次感谢您
【解决方案2】:

我认为transform 返回未设置任何值的行。既然如此,适当的变换更像是这样的:

SELECT s.tracking_number, s.invoice_number,
       MAX(CASE WHEN s.charge_description_code = 'SAT' THEN 'Y' ELSE 'N' END) AS SAT,
       MAX(CASE WHEN s.charge_description_code = 'AHW' THEN 'Y' ELSE 'N' END) AS AHW,
       MAX(CASE WHEN s.charge_description_code = 'AHL' THEN 'Y' ELSE 'N' END) AS AHL,
       MAX(CASE WHEN s.charge_description_code = 'AHS' THEN 'Y' ELSE 'N' END) AS AHS,
       MAX(CASE WHEN s.charge_description_code = 'RES' THEN 'Y' ELSE 'N' END) AS RES
FROM shipment_details s
WHERE s.tracking_number IS NOT NULL AND
      s.charge_category_detail_code NOT IN ('RADJ')
GROUP BY s.tracking_number, s.invoice_number;

【讨论】:

    猜你喜欢
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多