如何在T-SQL中实现以下场景

时间:2016-02-01 07:10:25

标签: sql sql-server sql-server-2008 sql-server-2012

我有一张如下表格

    BILL            BILL_DATE                   TYPE    AMOUNT
    BILL01300002    2016-01-30 15:34:48.957     1       250.00
    BILL01300003    2016-01-30 15:38:00.000     5       150.00
    BILL01300004    2016-01-30 15:49:48.000     5       200.00
    BILL01300002    2016-01-30 16:37:00.433     2       250.00
    BILL01300004    2016-01-30 17:37:00.233     7       1000.00
    BILL01300002    2016-01-30 18:42:54.927     3       250.00
    BILL02020006    2016-02-02 18:42:54.927     3       550.00

我需要根据一个案例显示一个额外的列[AMOUNT2]。情况是,如果相同的BILL在同一天出现(1,2,3)中的三个特定TYPE。然后我需要为这3条记录显示与TYPE 3 Amount列相同数量的额外列。另外,额外的列将是0。

在#TAB中我们可以在BILL01300002中找到这种情况。它是在同一天发生的。 对于3种特殊的不同类型1,2,3。

我的预期结果是

    BILL            BILL_DATE                   TYPE    AMOUNT      AMOUNT2
    BILL01300002    2016-01-30 15:34:48.957     1       250.00      250.00
    BILL01300003    2016-01-30 15:38:00.000     5       150.00      0
    BILL01300004    2016-01-30 15:49:48.000     5       200.00      0
    BILL01300002    2016-01-30 16:37:00.433     2       250.00      250.00
    BILL01300004    2016-01-30 17:37:00.233     7       1000.00     0
    BILL01300002    2016-01-30 18:42:54.927     3       250.00      250.00      
    BILL02020006    2016-02-02 18:42:54.927     3       550.00      0

我发布架构以供参考

        CREATE TABLE #TAB(BILL VARCHAR(250),BILL_DATE DATETIME, TYPE BIGINT, AMOUNT DECIMAL(18,2)  )

        INSERT INTO #TAB
        SELECT 'BILL01300002','2016-01-30 15:34:48.957',1, 250
        UNION ALL
        SELECT 'BILL01300003','2016-01-30 15:38:00.000',5, 150
        UNION ALL
        SELECT 'BILL01300004','2016-01-30 15:49:48.000',5, 200
        UNION ALL
        SELECT 'BILL01300002','2016-01-30 16:37:00.433',2, 250
        UNION ALL
        SELECT 'BILL01300004','2016-01-30 17:37:00.233',7, 1000
        UNION ALL
        SELECT 'BILL01300002','2016-01-30 18:42:54.927',3, 250
        UNION ALL
        SELECT 'BILL02020006','2016-02-02 18:42:54.927',3, 550

3 个答案:

答案 0 :(得分:2)

    SELECT *,
       ( CASE B.BILL
           WHEN (SELECT A.BILL
                 FROM   #TAB AS A
                 WHERE  TYPE IN( 1, 2, 3 )
                 GROUP  BY A.BILL
                 HAVING Count(A.BILL) >= 3) THEN amount
           ELSE 0
         END ) AS amount2
FROM   #TAB AS B 

:)希望能帮到你

答案 1 :(得分:1)

你可以这样试试,

private void deleteImageFromStorage(String imageName) {
    FileSystemStorage fss = FileSystemStorage.getInstance();
    fss.deleteRetry(fss.getAppHomePath() + imageName, 2);
}

for (int i = 0; i < myTop10NewsLowestId; i++) {
    deleteImageFromStorage("largeImage_" + i + ".jpg");
}

答案 2 :(得分:0)

尝试下面提到的代码 -

SELECT b.*
    ,(
        CASE 
            WHEN a.amount IS NOT NULL
                THEN a.amount
            END
        )
FROM (
    SELECT b.*
    FROM (
        SELECT bill
            ,max(type) AS type
        FROM TableA
        WHERE type IN (
                1
                ,2
                ,3
                )
        GROUP BY bill
            ,cast(bill_date AS DATE)
        HAVING count(*) = 3
        ) AS a
    RIGHT JOIN TableA AS b ON a.bill = b.bill
        AND a.type = b.type
    ) AS a
RIGHT JOIN TableA AS b ON a.bill = b.bill
    AND a.type = b.type

如果有帮助,请告诉我。