【问题标题】:set column value based on distinct values in another column根据另一列中的不同值设置列值
【发布时间】:2012-12-29 14:20:39
【问题描述】:

我正在尝试做与这个问题非常相似的事情:mysql - UPDATEing row based on other rows

我有一个名为 modset 的表格,格式如下:

member    year    y1    y2    y3    y1y2    y2y3    y1y3    y1y2y3 
a         1       0     0     0     0       0       0       0
a         2       0     0     0     0       0       0       0
a         3       0     0     0     0       0       0       0
b         1       0     0     0     0       0       0       0
b         2       0     0     0     0       0       0       0
c         1       0     0     0     0       0       0       0
c         3       0     0     0     0       0       0       0
d         2       0     0     0     0       0       0       0

第 3:9 列是二进制标志,用于指示成员记录的年份组合。所以我希望 SQL 更新的结果如下所示:

member    year    y1    y2    y3    y1y2    y2y3    y1y3    y1y2y3 
a         1       0     0     0     0       0       0       1
a         2       0     0     0     0       0       0       1
a         3       0     0     0     0       0       0       1
b         1       0     0     0     1       0       0       0
b         2       0     0     0     1       0       0       0
c         1       0     0     0     0       0       1       0
c         3       0     0     0     0       0       1       0
d         2       0     1     0     0       0       0       0

上面链接的问题中的代码做了非常接近的事情,但只有当它是对成员有记录的不同年份的计数时。我需要根据成员拥有记录的年份的特定值来创建列。

提前致谢!

解决方案

SELECT member,
    case when min(distinct(year)) = 1 and max(distinct(year)) = 1 then 1 else 0 end y1,
    case when min(distinct(year)) = 1 and max(distinct(year)) = 2 then 1 else 0 end y1y2,
    case when min(distinct(year)) = 1 and max(distinct(year)) = 3 and count(distinct(year)) = 2 then 1 else 0 end y1y3,
    case when min(distinct(year)) = 1 and max(distinct(year)) = 3 and count(distinct(year)) = 3 then 1 else 0 end y1y2y3,
    case when min(distinct(year)) = 2 and max(distinct(year)) = 2 then 1 else 0 end y2,
    case when min(distinct(year)) = 2 and max(distinct(year)) = 3 then 1 else 0 end y2y3,
    case when min(distinct(year)) = 3 then 1 else 0 end y3
INTO temp5
FROM modset
GROUP BY member;

UPDATE modset M
SET y1 = T.y1, y2 = T.y1, y3 = T.y3, y1y2 = T.y1y2, y1y3 = T.y1y3, y2y3 = T.y2y3, y1y2y3 = T.y1y2y3
FROM temp5 T
WHERE T.member = M.member;

【问题讨论】:

    标签: sql distinct inner-join


    【解决方案1】:

    您使用什么查询来返回成员记录年份的指标?

    听起来您希望获取查询结果并在更新中使用它:

    http://dev.mysql.com/doc/refman/5.0/en/update.html

    它可能看起来像这样:

    UPDATE targetTable t, sourceTable s 
    SET t.y1 = s.y1, t.y2 = s.y2 -- (and so on...)
    WHERE t.member = s.member AND t.year = m.year;
    

    【讨论】:

    • 我刚刚设法使用您描述的方法解决了这个问题,尽管使用了一个临时临时表。我使用案例语句来查找每个成员不同年份的最小值、最大值和计数。从这些您可以计算出要在临时表中设置的正确二进制标志,然后我在与临时表连接的原始表上使用更新语句。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 2018-08-16
    • 2014-12-19
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多