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 ...