[英]SQL - Splitting a column based on the values
我正在嘗試根據該列中的值將結果集中的列分為2列。 因此,用戶可以訂閱多個項目,並且該用戶可以具有2個可以接收此訂閱的電子郵件地址。 結果集提供了訂閱列表及其訂閱的電子郵件ID的對應條目。
數據庫詳細信息
Table 1 - user_subscriptions
user_id
email_id - 1 for email id 1 and 2 for email id 2
subscription_id
Table 2 - subscriptions
subscription_id
subscription_name
現在,無論是否通過電子郵件ID進行訂閱,我都需要該用戶的所有訂閱。 所以我得到這樣的結果集
+----------------------+----------+
| subscription_name | email_id |
+----------------------+----------+
| item1 | 1 |
| item1 | 2 |
| item2 | null |
| item3 | 1 |
| item4 | null |
| item5 | 2 |
+----------------------+----------+
所以我想將上面的結果集分成下面的東西
+-------------------+---------+---------+
| subscription_name | email_1 | email_2 |
+-------------------+---------+---------+
| item1 | 1 or Y | 1 or Y |
| item2 | 0 or N | 0 |
| item3 | 1 | 0 |
| item4 | 0 | 0 |
| item5 | 0 | 1 |
+-------------------+---------+---------+
希望這個問題有意義。 任何幫助,將不勝感激!
更新 - - - - - -
樣本數據:
subscriptions - +-----------------+-------------------+ | subscription_id | subscription_name | +-----------------+-------------------+ | 1 | item1 | | 2 | item2 | | 3 | item3 | | 4 | item4 | | 5 | item5 | +-----------------+-------------------+
user_subscriptions
+---------+----------+-----------------+ | user_id | email_id | subscription_id | +---------+----------+-----------------+ | 101 | 1 | 1 | | 101 | 2 | 1 | | 101 | 1 | 3 | | 101 | 2 | 5 | | 102 | 1 | 1 | | 102 | 2 | 1 | +---------+----------+-----------------+
預期結果:
對於user_id = 101
+-----------------+-------------------+--------+--------+ | subscription_id | subscription_name | mail_1 | mail_2 | +-----------------+-------------------+--------+--------+ | 1 | item1 | Y | Y | | 2 | item2 | N | N | | 3 | item3 | Y | N | | 4 | item4 | N | N | | 5 | item5 | N | Y | +-----------------+-------------------+--------+--------+
您需要條件聚合:
select us.subscription_name,
-- there's at least one email
CASE WHEN MIN(us.email_id) IS NOT NULL THEN 'Y' ELSE 'N' END as email_1,
-- there's more than one email
CASE WHEN MIN(us.email_id) <> MAX(us.email_id) THEN 'Y' ELSE 'N' END as email_2
from subscriptions as s
left join user_subscriptions as us
on s.subscription_id = us.subscription_id
where us.user_id = ...
group by us.subscription_name
SELECT
S.subscription_id,
S.subscription_name,
CASE
WHEN US1.mail_ID IS NULL THEN 'N'
ELSE 'Y'
END mail_1,
CASE
WHEN US2.mail_ID IS NULL THEN 'N'
ELSE 'Y'
END mail_2
FROM subscriptions S
LEFT JOIN user_subscriptions US1
ON S.subscription_id = US1.subscription_id
AND US1.mail_id = 1
LEFT JOIN user_subscriptions US2
ON S.subscription_id = US2.subscription_id
AND US2.mail_id = 2
WHERE us1.user_id = 5 -- or use a variable @user_ID
OR us2.user_id = 5
我以前沒有在sybase中工作,但我相當確定以下SQL可以輕松轉換(甚至直接運行):
SELECT
s.subscription_name,
COUNT(email_1.subscription_id) AS email_1,
COUNT(email_2.subscription_id) AS email_2
FROM subscriptions AS s
LEFT JOIN user_subscriptions AS email_1 ON (
s.subscription_id = email_1.subscription_id AND
email_1.email_id = 1
)
LEFT JOIN user_subscriptions AS email_2 ON (
s.subscription_id = email_2.subscription_id AND
email_2.email_id = 2
)
;
您還可以在SELECT
說IF(email_1.subscription_id IS NOT NULL, 'Y', 'N')
等,以返回直接的是/否,而不是計數等。
它的工作原理是LEFT JOIN
語句的列表將匹配任何email_id=1
和email_id=2
等的“用戶訂閱”記錄。
我缺乏sybase知識免責聲明: ANSI SQL無法執行PIVOT
如果sybase可以,那么您可以更加優雅地做到這一點。 還有一個問題+答案提示sybase可以執行此類操作; 值得一看的地方: https : //stackoverflow.com/a/8114446/817132
希望能幫助到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.