Sql server 条件聚合

Sql server 条件聚合,sql-server,aggregate-functions,conditional-statements,Sql Server,Aggregate Functions,Conditional Statements,我有一个包含以下字段的表: AuthorID BookTitle PageNo Key Value 其中,主键是一个复合键,由以下内容组成:AuthorID、BookTitle、PageNo、key 我需要一个查询,该查询将显示authord=“ABC”的所有书名,以及第一页中键“Field1”的值和最后一页中键“Field2”的值 我有以下疑问: SELECT BookTitle , a.FieldFromFirstPage , [Value] As FieldFromL

我有一个包含以下字段的表:

AuthorID
BookTitle
PageNo
Key
Value
其中,主键是一个复合键,由以下内容组成:
AuthorID、BookTitle、PageNo、key

我需要一个查询,该查询将显示authord=“ABC”的所有书名,以及第一页中键“Field1”的值和最后一页中键“Field2”的值

我有以下疑问:

SELECT BookTitle
     , a.FieldFromFirstPage
     , [Value] As FieldFromLastPage
     , b.LastPage 
FROM Table1
INNER JOIN (SELECT BookTitle, [Value] As FieldFromFirstPage 
     FROM Table1
     WHERE [Key]='Field1'
       and PageNo=1
       and AuthorID='ABC') As a ON BookTitle=a.BookTitle
INNER JOIN (SELECT BookTitle, MAX(PageNo) As LastPage
      FROM Table1 
      WHERE AuthorID='ABC' 
      GROUP BY BookTitle
      HAVING MAX(PageNo)> 0) As b ON BookTitle=b.BookTitle AND PageNo=b.LastPage
WHERE [Key]='Field2' and AuthorID='ABC'

这对我来说很有效,但我想知道是否有更好的方法使用条件聚合或其他方法来实现这一点?

首先,我要质疑表的设计。应该有一个带有AuthorID的表books(为什么是字母数字?希望不要将作者的姓名保存为ID!)和一个带有BookID作为参考的表pages。 但无论如何,这应该是可行的:

编辑:替换了第一次尝试,因为它不起作用。希望这次更好,但是没有数据很难测试

--Fetch only books of the given AuthorID
WITH bookCTE AS
(
    SELECT DISTINCT AuthorID,BookTitle
    FROM Table1
    WHERE AuthorID='ABC'
)
SELECT bookCTE.BookTitle
      ,(
        SELECT TOP 1 t.Field1 
        FROM Table1 AS t
        WHERE t.AuthorID=bookCTE.AuthorID
          AND t.BookTitle=bookCTE.BookTitle 
          AND t.PageNo=1      
       ) AS FieldFromFirstPage
      ,LastPageNumber.*
      ,(
        SELECT TOP 1 t.Field2 
        FROM Table1 AS t
        WHERE t.AuthorID=bookCTE.AuthorID
          AND t.BookTitle=bookCTE.BookTitle 
          AND t.PageNo=LastPageNumber.LastPage      
       ) AS FieldFromLastPage
FROM bookCTE
--find the max page number                     
CROSS APPLY(SELECT MAX(x.PageNo) FROM Table1 AS x WHERE x.AuthorID=bookCTE.AuthorID AND x.BookTitle=bookCTE.BookTitle) AS LastPageNumber(LastPage)

不幸的是,桌子的设计不能改变。这不取决于我-我只是在这种情况下写查询好吧,那就倒霉了。。。你试过上面的选择吗?你只需要在endShnugo中添加你的WHERE,你的查询做了一件完全不同的事情,甚至与我的查询不一样Hi Elena,很抱歉。。。所以我搞错了。也许您想发布CREATETABLE语句和一些行如何填充它?我将在几分钟后发布一条经过编辑的声明…(不确定,但最好在codereview.SE上问这个问题。)