【问题标题】:Need assistance to write query to get top number in a group需要帮助来编写查询以获取组中的最高号码
【发布时间】:2012-10-12 08:31:16
【问题描述】:

我的表有以下列,(复制以创建测试表)

CREATE TABLE dbo.[PDNApprovalDetail](
    [PDNApprovalMasterID] [int] NOT NULL,
    [PDNMasterID] [int] NOT NULL,
    [PDNApprovalDetailID] [int] IDENTITY(1,1) NOT NULL,
    [DocumentToApproveID] [int] NULL,
    [RulesID] [int] NULL,
    [RuleSignatureTypeID] [smallint] NULL,
    [SignatureTypeID] [smallint] NULL,
    [ApprovalOrder] [smallint] NULL,
 CONSTRAINT [PK_PDNApprovalDetail] PRIMARY KEY CLUSTERED 
(
    [PDNApprovalDetailID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

-- use this insert statement

INSERT INTO [dbo].[PDNApprovalDetail]
           ([PDNApprovalMasterID]
           ,[PDNMasterID]
           ,[DocumentToApproveID]
           ,[RulesID]
           ,[RuleSignatureTypeID]
           ,[SignatureTypeID]
           ,[ApprovalOrder])
     VALUES
           (136
           ,125
           ,7
           ,2
           ,1
           ,0
           ,1)

我的表中的数据可能如下所示(复制并粘贴以插入查询)

136,    125,    7,  2,  1,  0,  1
135,    125,    7,  2,  1,  1,  1
136,    125,    7,  2,  1,  1,  1
135,    125,    7,  2,  0,  0,  1
137,    126,    7,  2,  1,  0,  1
137,    126,    7,  2,  1,  0,  1
139,    126,    7,  2,  0,  1,  1
139,    126,    7,  2,  0,  1,  1
138,    127,    7,  2,  1,  1,  1
140,    127,    7,  2,  0,  0,  1
140,    127,    7,  2,  0,  0,  1

我希望通过分组并仅获取具有 MAX PDNApprovalMasterID 的行来输出查询,对于 125 个 PDNMasterID 的组,结果不应包含 ID 为 135 的行,用于组 125 等等, 对于 MAX PDNApprovalMasterID 139 的 126 行,137 不应该存在,PDNMasterID 127 结果行应该包含 140 并且不应该包含 138

查看查询如何获取其余列的总和,这是我正在尝试但没有得到正确结果的方法

SELECT DISTINCT pa.PDNMasterID, pa.DocumentToApproveID, pa.PDNApprovalMasterID
    , SUM(CASE WHEN pa.SignatureTypeID = pa.RuleSignatureTypeID THEN 1 ELSE 0 END) AS [Approved]
    , SUM(CASE WHEN pa.SignatureTypeID != pa.RuleSignatureTypeID THEN 1 ELSE 0 END) AS [Unapproved]
    , COUNT(*) AS RuleCount
    FROM dbo.PDNApprovalDetail pa
    WHERE pa.[DocumentToApproveID] = 7
    group by pa.PDNMasterID, pa.DocumentToApproveID, pa.PDNApprovalMasterID
    having pa.PDNApprovalMasterID = MAX(pa.PDNApprovalMasterID)

上述查询的结果,它包含 135 PDNAapprovalMasterID 不应该存在的行

PDNMasterID DocumentToApproveID PDNApprovalMasterID Approved Unapproved RuleCount
125                 7                   135             2         0         2
125                 7                   136             1         1         2

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    尝试将max 添加到select statement

    SELECT pa.PDNMasterID, pa.DocumentToApproveID, MAX(pa.PDNApprovalMasterID)
        , SUM(CASE WHEN pa.SignatureTypeID = pa.RuleSignatureTypeID THEN 1 ELSE 0 END) AS [Approved]
        , SUM(CASE WHEN pa.SignatureTypeID != pa.RuleSignatureTypeID THEN 1 ELSE 0 END) AS [Unapproved]
        , COUNT(*) AS RuleCount
        FROM dbo.PDNApprovalDetail pa
        WHERE pa.[DocumentToApproveID] = 7  
        and pa.PDNApprovalMasterID = (select MAX(pa1.PDNApprovalMasterID)
                                      from  dbo.PDNApprovalDetail pa1 
                                      where pa.PDNMasterID = pa1.PDNMasterID
                                       and pa.DocumentToApproveID = pa1.DocumentToApproveID
                                      ) 
        group by pa.PDNMasterID, pa.DocumentToApproveID;
    

    SQL Fiddle演示

    【讨论】:

    • 我试过了,但是不行,我也试过top 1但是失败了
    • 是否返回相同的结果?
    • @IrfanUllah - 你说你尝试了 Parado 的答案,但它不起作用,当我测试它时它对我有用。它是如何对您“不起作用”的,请描述问题。
    • 它显示行 ID 136,但查看最后一列它还包括行 ID 135 的总和
    • 查询中列 RuleCount 的结果值为 4,因为它还包括第 135 行它应该是 2(仅来自第 136 行的值),与列 Approved 和 Unapproved 的情况相同,它们的总和还包括第 135 行的值
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多