0

我有一个简单的表(ID、Member_ID、payment、date、payment_serial、running_total);我需要 payment_serial 才能使用数据导出到另一个系统。

我需要的导出是会员支付的所有款项(显示付款和日期),按 payment_serial 的顺序排列在一行中。

这是我使用的第一个查询:

SELECT
  `Member_ID`,
  IF(`payment_serial`=1,`payment`,0) AS `p1`,
  IF(`payment_serial`=1,`date`,0) AS `p1_date`,
  IF(`payment_serial`=1,`ID`,0) AS `p1_ID`,
  IF(`payment_serial`=2,`payment`,0) AS `p2`,
  IF(`payment_serial`=2,`date`,0) AS `p2_date`
  IF(`payment_serial`=2,`ID`,0) AS `p2_ID`,
FROM monthlies
WHERE `Member_ID` = 4198739

如果我使用这个查询,我会看到我需要的付款,但每个付款都在单独的一行中(这会在下一阶段产生很大的导入问题):

Member_ID    p1     p1_date  p1_ID    p2    p2_date  p2_ID ...
  4198739   34.50    41143    214      0      0       0    ... 
  4198739     0        0       0     34.50  41176    583   ...

我添加了 GROUP BY:

SELECT
  IF(`payment_serial`=1,`payment`,0) AS `p1`,
  IF(`payment_serial`=1,`date`,0) AS `p1_date`,
  IF(`payment_serial`=1,`ID`,0) AS `p1_ID`,
  IF(`payment_serial`=2,`payment`,0) AS `p2`,
  IF(`payment_serial`=2,`date`,0) AS `p2_date`,
  IF(`payment_serial`=2,`ID`,0) AS `p2_ID`
FROM monthlies
WHERE `Member_ID` = 4198739
GROUP BY `Member_ID`

这为每个成员提供了一行 - 但不是每次付款:

Member_ID    p1     p1_date  p1_ID    p2    p2_date  p2_ID ...
  4198739   34.50    41143    214      0      0       0    ... 

我哪里错了?

4

3 回答 3

2

这不完全是你的错。MySQL 错误地实现了 GROUP BY。此时,任何其他 SQL 平台都会给您一个语法错误。

尝试

SELECT 
  MAX(IF(`payment_serial`=1,`payment`,0)) AS `p1`, 
  MAX(IF(`payment_serial`=1,`date`,0)) AS `p1_date`, 
  MAX(IF(`payment_serial`=1,`ID`,0)) AS `p1_ID`, 
  MAX(IF(`payment_serial`=2,`payment`,0)) AS `p2`, 
  MAX(IF(`payment_serial`=2,`date`,0)) AS `p2_date`, 
  MAX(IF(`payment_serial`=2,`ID`,0)) AS `p2_ID` 
FROM monthlies 
WHERE `Member_ID` = 4198739 
GROUP BY `Member_ID` 
于 2012-10-11T12:42:10.023 回答
2

您期待来自 GROUP_BY 的错误输出。在 MySQLGROUP_BY中,它与诸如 etc 之类的命令结合使用,MAX, AVG, SUM以将所有结果放在一个合并的行中。

因此,如果您想导出数据,最好的方法是在不使用 group by 的情况下获取所有行,因为它将保留每一行及其唯一的成员 ID。

于 2012-10-11T12:46:58.667 回答
0

GROUP BY 在 SELECT 的 IF 之前。

于 2012-10-11T12:42:20.817 回答