繁体   English   中英

同一表中的多行到具有相似标识符的单行

[英]Multiple rows from same table to single row with like identifier

我是SQL查询的新手,正在尝试将多个行压缩为具有类似标识符的单行。 下面是一个示例:

Table orders:

groupid | question   | answer

|-----------------------------------|

abc000  | First Name | John 

abc000  | Last Name  | Doe

abc000  | City       | Denver

...     | ...        | ...

abc000  | Entry      | Individual

abc000  | Shirt Size | X-Large

abc001  | First Name | Jane

abc001  | Last Name  | Doe

abc001  | City       | Seattle

...     | ...        | ...

abc001  | Entry      | Individual

(No Shirt entry)

我正在尝试使其看起来像:

表格确认(所需输出):

groupid | 姓| 名| 城市| ... | 衬衫尺码

| ------------------------------------------------- --------- |

abc000 | 美国能源部 约翰| 丹佛| ... | X大

abc001 | 美国能源部 简| 西雅图| ... |

表确认(实际输出):

groupid | 姓| 名| 城市| ... | 衬衫尺码

| ------------------------------------------------- --------- |

abc000 | 美国能源部 约翰| 丹佛| ... |

abc000 | 美国能源部 约翰| 丹佛| ... | X大

abc001 | 美国能源部 简| 西雅图| ... |

查询是:

SELECT DISTINCT om.groupid, om.fid, om.eid, f.subtitle,
        IF(oi.question = 'First Name', oi.answer, '') AS fname,
        IF(oi1.question = 'Last Name', oi1.answer, '') AS lname,
        IF(oi2.question = 'City', oi2.answer, '') AS city,
        IF(oi3.question = 'State', oi3.answer, '') AS state,
        IF(oi4.question = 'Birthdate', oi4.answer, '') AS bday,
        IF(oi5.question = 'Gender', oi5.answer, '') AS gender,
        IF ( (oi6.question LIKE '%fee'), oi6.answer, '') as event,
        IF ( (oi7.question = 'shirt size (unisex cotton)'), oi7.answer, '') as shirt
    FROM ordermeta om
    JOIN orders o ON o.orderid=om.orderid
    LEFT JOIN orderitems oi ON oi.groupid=om.groupid
    LEFT JOIN orderitems oi1 ON oi1.groupid=om.groupid
    LEFT JOIN orderitems oi2 ON oi2.groupid=om.groupid
    LEFT JOIN orderitems oi3 ON oi3.groupid=om.groupid
    LEFT JOIN orderitems oi4 ON oi4.groupid=om.groupid
    LEFT JOIN orderitems oi5 ON oi5.groupid=om.groupid
    LEFT JOIN orderitems oi6 ON oi6.groupid=om.groupid
    LEFT JOIN orderitems oi7 ON oi7.groupid=om.groupid
    WHERE  oi.question = 'First NAME'
        AND oi1.question = 'Last Name'
        AND oi2.question = 'City'
        AND oi3.question = 'State'
        AND oi4.question = 'Birthdate'
        AND oi5.question = 'Gender'
        AND oi6.question LIKE '%fee%'
    ORDER BY lname ASC

如果删除衬衫尺寸,则效果很好。 我已经添加了:

AND oi7.question = "Shirt Size" 

除了它不一定总是“衬衫大小”,而是更多的“%shirt size%”,并且当没有问题=衬衫大小时,我希望它留一个空白或空白。 使用AND,只会给我带来衬衫问题的结果。 (140个结果中的55个)

在当前代码中,当问题=“衬衫尺寸”存在时,我得到两个条目(一个为空白,另一个具有良好的信息)。 所有其他条目只有一个没有信息的条目。 (140个结果中的195个)

我已经尝试了多种不同的方法,例如CASE,IF THEN语句。 在添加衬衫问题之前,所有这些人都在可行的地方做同样的事情。

请让我知道是否需要更多信息。 谢谢。

我尝试过的一种SE类型的示例:将多行合并为一行MySQL

我发现有两个问题带有“衬衫”。 这是在创建适合模型的第二个条目,使第二行留有空白,因为它不适合选择中的第二个过滤器。 这是我最终不得不写的。

SELECT DISTINCT om.groupid, om.fid, om.eid, f.subtitle,
        IF(oi.question = 'First Name', oi.answer, '') AS fname,
        IF(oi1.question = 'Last Name', oi1.answer, '') AS lname,
        IF(oi2.question = 'City', oi2.answer, '') AS city,
        IF(oi3.question = 'State', oi3.answer, '') AS state,
        IF(oi4.question = 'Birthdate', oi4.answer, '') AS bday,
        IF(oi5.question = 'Gender', oi5.answer, '') AS gender,
        IF ( (oi6.question LIKE '%fee'), oi6.answer, '') as event,
        IF ( (oi7.question IN ('Youth Shirts','Event Shirt','Tech Shirt Size','Series Shirt','Choose Event Shirt(s)','Shirt Size (Included in Entry)','Regular T-Shirt OR Tech Shirt - Select Size/Type','shirt size (unisex cotton)')), oi7.answer, '') as shirt
    FROM ordermeta om
    JOIN orders o ON o.orderid=om.orderid
    LEFT JOIN orderitems oi ON oi.groupid=om.groupid AND oi.question = 'First Name'
    LEFT JOIN orderitems oi1 ON oi1.groupid=om.groupid AND oi1.question = 'Last Name'
    LEFT JOIN orderitems oi2 ON oi2.groupid=om.groupid AND oi2.question = 'City'
    LEFT JOIN orderitems oi3 ON oi3.groupid=om.groupid AND oi3.question = 'State'
    LEFT JOIN orderitems oi4 ON oi4.groupid=om.groupid AND oi4.question = 'Birthdate'
    LEFT JOIN orderitems oi5 ON oi5.groupid=om.groupid AND oi5.question = 'Gender'
    LEFT JOIN orderitems oi6 ON oi6.groupid=om.groupid AND oi6.question LIKE '%fee%'
    LEFT JOIN orderitems oi7 ON oi7.groupid=om.groupid AND oi7.question IN ('Youth Shirts','Event Shirt','Tech Shirt Size','Series Shirt','Choose Event Shirt(s)','Shirt Size (Included in Entry)','Regular T-Shirt OR Tech Shirt - Select Size/Type','shirt size (unisex cotton)')
    LEFT JOIN forms f ON f.fid=om.fid
    WHERE om.status = 1
        AND o.paid = 1
        AND f.fid=$fid
    ORDER BY lname ASC

因为衬衫尺寸条目是灵活的,所以这是非常丑陋的...将需要标准化条目以使查询仅查找类似“衬衫尺寸%”

SELECT  om.groupid, 
        om.fid, 
        om.eid, 
        f.subtitle,
        IF(oi.question = 'First Name', oi.answer, '') AS fname,
        IF(oi1.question = 'Last Name', oi1.answer, '') AS lname,
        IF(oi2.question = 'City', oi2.answer, '') AS city,
        IF(oi3.question = 'State', oi3.answer, '') AS state,
        IF(oi4.question = 'Birthdate', oi4.answer, '') AS bday,
        IF(oi5.question = 'Gender', oi5.answer, '') AS gender,
        IF ( (oi6.question LIKE '%fee'), oi6.answer, '') as event,
        IF ( (oi7.question = 'shirt size (unisex cotton)'), oi7.answer, '') as shirt
    FROM ordermeta om
    JOIN orders o ON o.orderid=om.orderid
    LEFT JOIN orderitems oi ON oi.groupid=om.groupid
    WHERE   oi.question IN( 'First NAME','Last Name','City','State','Birthdate','Gender')
        OR oi.question LIKE  '%fee%'
GROUP BY om.groupid, 
        om.fid, 
        om.eid, 
        f.subtitle,
        IF(oi.question = 'First Name', oi.answer, '') AS fname,
        IF(oi1.question = 'Last Name', oi1.answer, '') AS lname,
        IF(oi2.question = 'City', oi2.answer, '') AS city,
        IF(oi3.question = 'State', oi3.answer, '') AS state,
        IF(oi4.question = 'Birthdate', oi4.answer, '') AS bday,
        IF(oi5.question = 'Gender', oi5.answer, '') AS gender,
        IF ( (oi6.question LIKE '%fee'), oi6.answer, '') as event,
        IF ( (oi7.question = 'shirt size (unisex cotton)'), oi7.answer, '') as shirt
    ORDER BY lname ASC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM