0

私はこの質問に非常に似た何かをしようとしています:mysql-他の行に基づいて行を更新します

次の形式の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;
4

1 に答える 1

2

メンバーがレコードを持っている年のインジケーターを返すために使用しているクエリは何ですか?

クエリ結果を取得して更新に使用したいようです。

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;
于 2012-12-29T15:16:04.510 に答える