【问题标题】:Problem in query in sql server 2008sql server 2008中的查询问题
【发布时间】:2011-08-29 12:00:43
【问题描述】:

我有一个名为album 的表格,其中包含以下列:

Album_Id, User_Id, Report_Id, PhotoName

User_IdReport_Id 组合上有不同的 Photoname

喜欢:

Album_Id   User_Id    Report_Id       PhotoName
1          1          16              A.jpg
2          1          16              B.jpg
3          2          17              C.jpg
4          2          17              D.jpg

我只想检索格式的数据

User_Id    Report_Id       PhotoName1     PhotoName2
 1          16              A.jpg          B.jpg  
 2          17              C.jpg          D.jpg

最大照片为 4...

【问题讨论】:

  • 问题出在哪里?你试过什么?什么没用?
  • 每个用户是否总是只有 2 张照片?如果有 100 - 你想要 100 列 w/ PhotoName### 返回怎么办?为什么?
  • "2 17 C.jpg D.jpg" - 逻辑是什么?您取 2 个 report_id 中的一个,并将两张照片放在不同的列中。如果有 3 张照片呢?这个例子留下了很多问题。请说明。
  • 您使用什么逻辑在结果的第 2 行返回 Report_Id = 17 而不是 12?好像这个字段是不必要的。
  • @Jeff - 好地方,但在他们谈论User_Id, Report_Id 组合时似乎是一个错字。 @Supriya你能澄清一下吗?

标签: sql-server tsql sql-server-2008 sql-server-express


【解决方案1】:
WITH    cte
          AS ( SELECT   * ,
                        ROW_NUMBER() OVER ( PARTITION BY User_Id, Report_Id ORDER BY Album_Id ) AS RN
               FROM     T
             )
    SELECT  User_Id ,
            Report_Id ,
            MAX(CASE WHEN RN = 1 THEN PhotoName
                END) AS PhotoName1 ,
            MAX(CASE WHEN RN = 2 THEN PhotoName
                END) AS PhotoName2 ,
            MAX(CASE WHEN RN = 3 THEN PhotoName
                END) AS PhotoName3 ,
            MAX(CASE WHEN RN = 4 THEN PhotoName
                END) AS PhotoName4
    FROM cte
    GROUP BY User_Id ,
            Report_Id    

【讨论】:

  • 已编辑以添加 3/4 的 cols 并且您缺少 FROM ;)
  • @Supriya - 没问题。如果它对您有用,请点击答案左侧的刻度线,将此问题标记为已回答。
  • 嗨,我在我的项目中使用了你的解决方案,但现在我遇到了另一个问题,当表中的数据不多但现在表中有大约 3000 条记录时,它工作正常,查询是响应太慢。请给我一些解决方案,以便它可以快速运行......谢谢
【解决方案2】:
SELECT a.User_Id, a.Report_Id, a.PhotoName as 'PhotoName1', a2.PhotoName as 'PhotoName2', a3.PhotoName as 'PhotoName3', a4.PhotoName as 'PhotoName4'
FROM album a
    LEFT JOIN album a2 on a2.User_Id = a.User_Id and a2.Report_Id = a.Report_Id AND a2.Album_Id != a.Album_Id
    LEFT JOIN album a3 on a3.User_Id = a.User_Id and a3.Report_Id = a.Report_Id AND a3.Album_id NOT IN (a.Album_Id, a2.Album_Id)
    LEFT JOIN album a4 on a4.User_Id = a.User_Id and a4.Report_Id = a.Report_Id AND a4.Album_id NOT IN (a.Album_Id, a2.Album_Id, a3.Album_Id)
ORDER BY a.User_Id, a.Report_Id ASC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多