データベースはなんでしょうか?(Oracle?PostgreSQL?など)
あとたいていのデータベースではdateは予約語なのでカラム名には使わないほうがよいでしょう。
一例ですが、下記のようなSELECT文で取れませんか?(Oracleを想定して書きました。dateは予約語なのでダブルクォーテーションで囲ってます)
INSERT INTO SELECTのような方法でテーブルに挿入可能だと思います。
```
SELECT
ut.id
,ut."date"
,(SELECT COUNT(st.item) FROM shopping_tbl st WHERE st.id = ut.id AND st."date" = ut."date" AND st.item = ut.top_1) as top1_count
,(SELECT COUNT(st.item) FROM shopping_tbl st WHERE st.id = ut.id AND st."date" = ut."date" AND st.item = ut.top_2) as top2_count
FROM
user_tbl ut
```
1select query.id, query.date, count(query.item = top_1 or null) as top1_count, count(query.item = top_2 or null) as top2_count from (
2select u.*, s.id as s_id, s.date as s_date, s.item from user_tbl u
3left outer join shopping_tbl s on u.id = s.id and u.date = s.date and (u.top_1 = s.item or u.top_2 = s.item)
4) query
5group by query.id, query.date;
テストデータ
-- DDL
CREATE TABLE `shopping_tbl` (
`id` int NOT NULL,
`date` varchar(4) DEFAULT NULL,
`item` varchar(45) DEFAULT NULL
);
CREATE TABLE `user_tbl` (
`id` int NOT NULL,
`date` varchar(4) DEFAULT NULL,
`top_1` varchar(45) DEFAULT NULL,
`top_2` varchar(45) DEFAULT NULL
);
-- データ
INSERT INTO user_tbl VALUES (1,'0101','item_a','item_b');
INSERT INTO user_tbl VALUES (1,'0102','item_a','item_b');
INSERT INTO user_tbl VALUES (1,'0103','item_c','item_b');
INSERT INTO user_tbl VALUES (99,'1231','item_c','item_b');
INSERT INTO shopping_tbl VALUES (1,'0101','item_a');
INSERT INTO shopping_tbl VALUES (1,'0101','item_a');
INSERT INTO shopping_tbl VALUES (1,'0101','item_c');
INSERT INTO shopping_tbl VALUES (1,'0101','item_b');
INSERT INTO shopping_tbl VALUES (1,'0102','item_a');
INSERT INTO shopping_tbl VALUES (1,'0102','item_a');
INSERT INTO shopping_tbl VALUES (1,'0102','item_a');
INSERT INTO shopping_tbl VALUES (1,'0103','item_a');
INSERT INTO shopping_tbl VALUES (1,'0103','item_b');
INSERT INTO shopping_tbl VALUES (1,'0103','item_a');
INSERT INTO shopping_tbl VALUES (99,'1231','item_c');
SochiAdachi様、ご回答ありがとうございます。
left outer joinならHiveで行けます、大変助かりました。
教えていただいたクエリを基にHiveに翻訳して、下記で回すことができました。
SELECT
user_tbl.id,
user_tbl.date_,
SUM(IF(user_tbl.top_1=shopping_tbl.item,1,0)) AS top1_count,
SUM(IF(user_tbl.top_2=shopping_tbl.item,1,0)) AS top2_count
FROM
user_tbl
LEFT OUTER JOIN shopping_tbl
ON(user_tbl.id=shopping_tbl.id AND user_tbl.date_=shopping_tbl.date_)
GROUP BY user_tbl.id,user_tbl.date_
errormaker74様、Orlofsky様にも感謝を。