1

私のテーブルには次の列があります(コピーしてテストテーブルを作成します)

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の行のみをグループ化して取得することにより、クエリの出力が必要です。125PDNMasterIDのグループの場合、結果にはグループ125のID 135の行が含まれていてはならず、126のグループの場合、MAX PDNApprovalMasterID 139、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のPDNApprovalMasterID行が含まれています

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

1 に答える 1

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フィドルデモ

于 2012-10-12T08:34:42.997 に答える