如何选择和合并一些重复数据的记录并追加

时间:2014-02-24 06:05:28

标签: sql sql-server

我在试图完成听起来相当简单的事情的逻辑上磕磕绊绊,但我无法理解如何做到这一点。

我有一个用户表,其中包含“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

GroupContentTable

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行。

我不确定这是否可行。我愿意改变结构。

2 个答案:

答案 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