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 имеет только один результат для этого номера счета.
Текущий результат:
Желаемый результат:
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: