mysql透视表

3htmauhk  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(313)

最初是基于行中的列值在查询时询问的。
我有小提琴http://sqlfiddle.com/#!9/362f1cd/2。
我有一个customer表,其中包含id、name、mobile、email等列,还有一个weekly summary表,其中包含id、customerid、day\u of \u week、type\u of \u food、name\u of \u food等列。食物栏的类型有早餐、午餐、晚餐、蛋白质、零食等值(可以是n种)。
我需要的是这样一份报告
客户姓名,手机,电子邮件,早餐,午餐,早餐2,零食1,零食2(可高达(n)
acc1,mob1,email1,早餐食物名称,午餐食物名称,晚餐食物名称。。。acc2,mob2,email2,早餐食物的名称,午餐食物的名称,晚餐食物的名称。。。
请记住,同一天可以有多种食物,比如一个账户有2份早餐和3份零食。
请注意,问题@mysql pivot row into dynamic number of columns只会有助于获取元素的计数(类型为\u of \u food),而我需要将它们分开(以及名称为\u of \u food的值),以防有2个条目(甚至是同一类型的条目)。
编辑:基于sqlfiddle添加预期结果
姓名、手机、电子邮件、白天、早餐、零食、午餐、零食1、晚餐、零食2
账号1234,acc1@yopmail.com,周一,鸡蛋,薯条,米饭,苹果,面包,豆腐
账号1234,acc1@yopmail.com星期二,面包,-,-,-,牛奶-
账号2345,acc2@yopmail.com,周一,鸡蛋,薯条,米饭,苹果,面包-
账号2345,acc2@yopmail.com周二,-,凝乳,面包,-,牛奶-

mitkmikd

mitkmikd1#

我会用 group_concat 功能:

SELECT c.id, c.name, c.email, w.day_of_week,
    group_concat(CASE WHEN w.type_of_food = 'Breakfast' THEN w.name_of_food END ) As breakfests,
    group_concat(CASE WHEN w.type_of_food = 'Snack' THEN w.name_of_food END ) As Snacks,
    group_concat(CASE WHEN w.type_of_food = 'Lunch' THEN w.name_of_food END ) As Lunches,
    group_concat(CASE WHEN w.type_of_food = 'Dinner' THEN w.name_of_food END ) As Dinners
FROM customer c
JOIN weekly_report w ON c.id = w.customerid
GROUP BY c.id, c.name, c.email, w.day_of_week

演示:http://sqlfiddle.com/#!9/362f1cd/3号

| id | name |            email | day_of_week | breakfests |           Snacks | Lunches | Dinners |
|----|------|------------------|-------------|------------|------------------|---------|---------|
|  1 | acc1 | acc1@yopmail.com |         Mon |       Eggs | Fries,Apple,Curd |    Rice |   Bread |
|  1 | acc1 | acc1@yopmail.com |         Tue |      Bread |           (null) |  (null) |    Milk |
|  2 | acc2 | acc2@yopmail.com |         Mon |       Eggs |      Fries,Apple |    Rice |   Bread |
|  2 | acc2 | acc2@yopmail.com |         Tue |     (null) |             Curd |   Bread |    Milk |

相关问题