Sql 根据条件创建新行
我正在为支票摘要报告提取一组信息,我遇到了一个问题,需要显示支票的完整历史记录。特别是,比如说我开了一张支票。此支票可能会作废。如果它在我们的程序中被作废,它只会将支票的状态更改为作废。但是,我需要能够创建一个新行条目并相应地操作数据 这是我正在处理的问题Sql 根据条件创建新行,sql,reporting-services,Sql,Reporting Services,我正在为支票摘要报告提取一组信息,我遇到了一个问题,需要显示支票的完整历史记录。特别是,比如说我开了一张支票。此支票可能会作废。如果它在我们的程序中被作废,它只会将支票的状态更改为作废。但是,我需要能够创建一个新行条目并相应地操作数据 这是我正在处理的问题 SELECT DISTINCT O.GFNo AS 'FileNumber' ,CASE WHEN C.VoidDate IS NOT NULL THEN C.VoidDate
SELECT DISTINCT
O.GFNo AS 'FileNumber'
,CASE
WHEN C.VoidDate IS NOT NULL
THEN C.VoidDate
WHEN C.VoidDate IS NULL
THEN C.CheckDate
ELSE NULL
END AS 'Date'
-- Check type descriptions.
,CASE
WHEN C.CheckStatus NOT IN (3,4) AND C.VoidDate IS NULL
THEN CASE
WHEN C.IsTransfer = 0 AND C.IsWire = 0 AND C.IsEFER = 0
THEN 'Check'
WHEN C.IsTransfer = 1
THEN 'Transfer'
WHEN C.IsWire = 1
THEN 'Wire'
WHEN C.IsEFER = 1
THEN 'EFER'
END
-- Stopped checks.
WHEN C.CheckStatus = 3 AND C.VoidDate IS NOT NULL
THEN CASE
WHEN C.IsTransfer = 0 AND C.IsWire = 0 AND C.IsEFER = 0
THEN 'Stopped Check'
WHEN C.IsTransfer = 1
THEN 'Stopped Transfer'
WHEN C.IsWire = 1
THEN 'Stopped Wire'
WHEN C.IsEFER = 1
THEN 'Stopped EFER'
END
-- Voided checks.
WHEN C.CheckStatus = 4 AND C.VoidDate IS NOT NULL
THEN CASE
WHEN C.IsTransfer = 0 AND C.IsWire = 0 AND C.IsEFER = 0
THEN 'Void Check'
WHEN C.IsTransfer = 1
THEN 'Void Transfer'
WHEN C.IsWire = 1
THEN 'Void Wire'
WHEN C.IsEFER = 1
THEN 'Void EFER'
END
END AS 'Description'
-- Check number.
,CASE
WHEN C.IsTransfer = 1
THEN 'XFer'
WHEN C.IsConsolidated = 1 AND C.ConsolidatedCheckID > 0
THEN 'Consolidated'
WHEN C.IsEFER = 1
THEN 'EFER-' + CONVERT(VARCHAR(MAX), C.WireNumber)
WHEN C.IsWire = 1
THEN 'W-' + CONVERT(VARCHAR(MAX), C.WireNumber)
WHEN C.IsCashiersCheck = 1
THEN 'C-' + CONVERT(VARCHAR(MAX), C.CheckNumber)
ELSE CONVERT(VARCHAR(MAX), C.CheckNumber)
END AS 'CheckNumber'
,CONVERT(VARCHAR(MAX), 0) AS 'Receipts'
,CASE
WHEN C.CheckStatus = 4 AND C.VoidDate IS NOT NULL
THEN ISNULL(C.Amount, 0)
ELSE CAST(0.0 - C.Amount AS MONEY)
END AS 'Disbursements'
FROM
Checks C
LEFT JOIN dbo.Orders O
ON C.OrdersID = O.OrdersID
LEFT JOIN CheckSessionDetail CSD
ON C.ChecksID = CSD.ChecksID
AND CSD.ActionType IN (6,9)
LEFT JOIN CheckSession CS
ON CSD.CheckSessionID = CS.CheckSessionID
WHERE
O.OrdersID = @OrdersID
AND C.CheckDate IS NOT NULL
这就是它正在回归的东西。如果支票作废,它只需将描述更改为“作废”
| FileNumber | Date | Description | CheckNumber | Receipts | Disbursements |
| 1 | 8/8/2014 | Check | 1001 | 0 | $7500 |
| 1 | 8/8/2014 | Check | 1002 | 0 | $5000 |
| 1 | 8/8/2014 | Void | 1003 | 0 | $1000 |
这就是我需要它返回的方式:
| FileNumber | Date | Description | CheckNumber | Receipts | Disbursements |
| 1 | 8/8/2014 | Check | 1001 | 0 | $7500 |
| 1 | 8/8/2014 | Check | 1002 | 0 | $5000 |
| 1 | 8/8/2014 | Check | 1003 | 0 | $1000 |
| 1 | 8/8/2014 | Void | 1003 | $1000 | $0 |
请注意,如果支票作废,它将保留初始支票条目,但也会创建一个作废条目,并将美元金额放入“收据”列。它还将保留相同的CheckNumber
从本质上讲,是否可以这样说:如果支票的状态为Void,则创建一个新行条目?我想一个临时的桌子可能会有用,但我并没有对它们进行太多的研究。我整天都在绞尽脑汁想弄明白这一点,所以你们能提供的任何和所有帮助都将是巨大的帮助。当然,而不是:
FROM Checks C
LEFT JOIN dbo.Orders O ...
尝试:
在您的案例陈述中使用
typ
,用于说明
,收据
,等等。这非常有效。非常感谢您的帮助!
SELECT DISTINCT
O.GFNo AS 'FileNumber'
,c.Date
...
FROM ( select Date = CheckDate, typ = 'Check', * from Checks
UNION ALL
select Date = VoidDate, typ = 'Void', * from Checks WHERE VoidDate is not null ) c
LEFT JOIN dbo.Orders O ...