Почему мой сценарий возвращает несколько строк для случая, когда? - PullRequest
0 голосов
/ 29 октября 2019
DECLARE @StartDate AS SMALLDATETIME
DECLARE @EndDate AS SMALLDATETIME
DECLARE @BranchNum AS INT

SET @StartDate = '2019-10-21'
SET @EndDate = '2019-10-25'
set @BranchNum = '9'

SELECT q.Branch
, q.[Teller Number]
, q.[Account Number]
, COUNT(q.Shares) OVER (PARTITION BY q.[Account Number]) AS [Shares]
, q.SharesBalance
, q.[Share Type]
, q.[Share ID]
, MAX(q.[Debit]) AS [Debit]
FROM(
SELECT DISTINCT
s.branch AS [Branch]
, s.CREATEDBYUSER AS [Teller Number]
, acct.accountnumber AS [Account Number]
, COUNT( CASE WHEN s.CLOSEDATE is null 
        AND s.CHARGEOFFDATE is NULL
        AND (s.OPENDATE >= @StartDate AND s.OPENDATE <= @EndDate)
        then s.PARENTACCOUNT
        END) AS [Shares]
, CASE WHEN s.CLOSEDATE is null 
    AND s.CHARGEOFFDATE is NULL 
    AND (s.OPENDATE >= @StartDate AND s.OPENDATE <= @EndDate)
    THEN s.balance 
    else 0
    END AS [SharesBalance]
, CASE WHEN s.CLOSEDATE is null 
    AND s.CHARGEOFFDATE is NULL
    THEN s.TYPE
    ELSE 0
    END AS [Share Type]
, CASE WHEN s.CLOSEDATE is null 
    AND s.CHARGEOFFDATE is NULL
    then s.ID
    ELSE 0
    END AS [Share ID]
, CASE  
    When c.TYPE in (15,16,17) 
    AND c.STATUS = 1 
    AND c.CLOSEDATE is null 
    AND (c.ISSUEDATE >= @StartDate AND c.ISSUEDATE <= @EndDate)
    THEN 1
    ELSE 0
    END AS [Debit]

from ARCUSYM000.dbo.ACCOUNT acct
INNER join ARCUSYM000.dbo.savings s
    on acct.ACCOUNTNUMBER = s.PARENTACCOUNT and s.ProcessDate =     acct.ProcessDate
INNER join arcuSYM000.dbo.CARD c 
    on acct.ACCOUNTNUMBER = c.PARENTACCOUNT and c.ProcessDate =     acct.ProcessDate
where acct.CLOSEDATE is null  
    AND s.CLOSEDATE is null 
    AND s.chargeoffdate is null 
    AND ((s.OPENDATE >= @StartDate AND s.OPENDATE <= @EndDate)
    OR (acct.OPENDATE >= @StartDate AND acct.OPENDATE <= @EndDate))
    AND acct.memberstatus = 0 
    AND s.branch is not null 
    AND s.branch IN (@BranchNum)
    AND s.ProcessDate = CONVERT(VARCHAR(8), dateadd(day,-1, getdate()), 112)
    AND acct.ProcessDate = CONVERT(VARCHAR(8), dateadd(day,-1, getdate()), 112)
    AND c.ProcessDate = CONVERT(VARCHAR(8), dateadd(day,-1, getdate()), 112)
GROUP BY s.BRANCH
    , s.CREATEDBYUSER
    , acct.ACCOUNTNUMBER
    , s.CLOSEDATE
    , s.CHARGEOFFDATE
    , s.BALANCE
    , s.TYPE
    , s.ID
    , c.TYPE
    , c.STATUS
    , c.USAGEDATE
    , c.CLOSEDATE
    , c.ISSUEDATE
    , acct.STATEMENTMAILCODE
    , s.SHARECODE
    , s.OVERDRAFTTOLERANCE
    , s.OPENDATE
    , s.PARENTACCOUNT
) q
GROUP BY q.Branch
    , q.[Teller Number]
    , q.[Account Number]
    , q.SharesBalance
    , q.Shares
    , q.[Share Type]
    , q.[Share ID]

ORDER BY q.[Account Number], q.[Teller Number]

Сейчас мой сценарий возвращает несколько строк для каждой учетной записи в дебетовом столбце, когда он должен возвращать только одну строку.

Я не уверен, почему он возвращает несколько строк для каждогосчет, поскольку таблица CARD имеет только один результат для этого номера счета.

Текущий результат: Current Result:

Желаемый результат: Desired Result

SELECT * FROM dbo.CARD c
WHERE c.PARENTACCOUNT = '123456'
    AND c.ProcessDate = CONVERT(VARCHAR(8), dateadd(day,-1, getdate()), 112)
    AND c.TYPE in (15,16,17) 
    AND c.STATUS = 1 
    AND c.CLOSEDATE is null 

При выборе из таблицы CARD: enter image description here

1 Ответ

1 голос
/ 29 октября 2019

Вы пробовали следующую модификацию:в предложении SELECT

SELECT q.Branch
    , q.[Teller Number]
    , q.[Account Number]
    , COUNT(q.Shares) OVER (PARTITION BY q.[Account Number]) AS [Shares]
    , q.SharesBalance
    , q.[Share Type]
    , q.[Share ID]
    , Max(q.[Debit]) [Debit]    ----MODIFIED

в предложении GROUP BY:

GROUP BY q.Branch
    , q.[Teller Number]
    , q.[Account Number]
    , q.SharesBalance
    , q.Shares
    , q.[Share Type]
    , q.[Share ID]
   -- , q.Debit         ---- MODIFIED 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...