我在试图完成听起来相当简单的事情的逻辑上磕磕绊绊,但我无法理解如何做到这一点。
我有一个用户表,其中包含“UserID”和“GroupID”。用户可以属于多个组,因此他们可以多次在表中。
我还有一个表,其中包含不同组“GroupContentTable”的内容,包含“UserTimeFrame”,“GroupID”,“Content1”,“Content2”,“Content3”。
我遇到的问题是,如果用户只属于一个组,我想为用户输出属于该组的3个“内容”,如果用户属于两个组,我想输出2个一个组和另一个用户,如果他们属于3个组,我想显示3个内容,但每组只有一个。
我正在思考一些问题(抱歉,不是那些精通SQL的)
SELECT u.UserID, CASE u.GroupID
WHEN 'GroupID' == 'Group1' AND 'c.UserFrequency' ==1 THEN 'c.Content1' AND 'Content2' AND 'Content3' END , c.UserTimeFrame, c.Content1, c.Content2, c.Content3
FROM UserTable u INNERJOIN UserContentTable c
ON u.GroupID = c.GroupID
我正在考虑加入该表并使用CASE语句来设置不同的条件,但它开始分崩离析。
这就是我所拥有的:
UserID | GroupID
ID1 | Group 1
ID1 | Group 2
ID2 | Group 3
ID1 | Group 3
ID3 | Group 2
ID3 | Group 3
GroupID | UserTimeSpan | Content1 | Content2 | Content3
Group1 | 1 | UserTxt11 | UserTxt12 | UserTxt13
Group2 | 1 | UserTxt21 | UserTxt22 | UserTxt23
Group3 | 1 | UserTxt31 | UserTxt32 | UserTxt33
Group1 | 2 | UserTxt121 | UserTxt122 | UserTxt123
我想输出这个:
UserID | UserTimeSpan | UserContent1 | UserContent2 | UserContent3
ID1 | 1 | UserTxt11 | UserTxt21 | UserTxt31
ID2 | 1 | UserTxt31 | UserTxt32 | UserTxt33
ID3 | 1 | UserTxt21 | UserTxt22 | UserTxt31
连接将为每个用户输出一行,因此对于用户ID1,将有3行但我希望它根据其GroupID仅输出具有适当内容的1行。
我不确定这是否可行。我愿意改变结构。
答案 0 :(得分:0)
首先执行此类cross join
,并消除无效行:
select *
from (select u.UserID u1, u.GroupID g1, g.GroupID g2, g.*
from UserTable u
cross join GroupContentTable g) t
where t.g1 = t.g2;
你最终会得到一张这样的表:
UserID | GroupID | GroupID | UserTimeSpan | Content1 | Content2 | Content3
ID1 | Group 1 | Group1 | 1 | UserTxt11 | UserTxt12 | UserTxt13
ID1 | Group 2 | Group2 | 1 | UserTxt21 | UserTxt22 | UserTxt23
ID2 | Group 3 | Group3 | 1 | UserTxt31 | UserTxt32 | UserTxt33
ID1 | Group 3 | Group3 | 1 | UserTxt31 | UserTxt32 | UserTxt33
ID3 | Group 2 | Group2 | 1 | UserTxt21 | UserTxt22 | UserTxt23
ID3 | Group 3 | Group3 | 1 | UserTxt31 | UserTxt32 | UserTxt33
现在由您决定如何在此处移动,您可以使用具有多个更新语句的临时表。
但我认为您需要更改GroupContent表设计。我希望每个内容都有自己的行,然后如果你需要对它们进行分组,就会有一个用于组的列。这将使您的查询更容易。
答案 1 :(得分:0)
试试这个......
SELECT
U.UserID,
G.UserTimeSpan,
G.GroupID,
G.Content1,
G.Content2,
G.Content3 ,
ROW_NUMBER() OVER( PARTITION BY G.UserTimeSpan,U.UserID ORDER BY G.UserTimeSpan,U.UserID,G.GroupID ) AS CNT
INTO TempTable
FROM @UserTable U
JOIN @GroupContentTable G ON G.GroupID = U.GroupID
SELECT
UserID,
UserTimeSpan,
Content1,
ISNULL((SELECT Content1 FROM TempTable WHERE UserID = C.UserID AND UserTimeSpan = C.UserTimeSpan AND CNT = C.CNT +1 AND (SELECT CNT FROM TempTable WHERE UserID = C.UserID AND UserTimeSpan = C.UserTimeSpan AND CNT = C.CNT +2) = 3) ,Content2) AS 'Content2',
ISNULL(ISNULL((SELECT Content1 FROM TempTable WHERE UserID = C.UserID AND UserTimeSpan = C.UserTimeSpan AND CNT = C.CNT +2) ,(SELECT Content1 FROM TempTable WHERE UserID = C.UserID AND UserTimeSpan = C.UserTimeSpan AND CNT = C.CNT +1)),Content3) AS 'Content3'
FROM TempTable C
WHERE CNT=1
DROP TABLE TempTable