如何在多条件的情况下制作多列

时间:2017-01-21 11:12:00

标签: sql-server

我有3个SQL语句我想将它们合并为一个但是每个都有自己的where条件我如何将它们合并到一个查询中,以显示每个查询的结果

项目代码||余额||薪资||材料

第一

SELECT
    ProjectCode,
    SUM (- 1 *(CreditAm) +(DebitAm)) AS Balance
FROM
    [dbo].[AcDetail]
WHERE
    AcCode IN (
        401000,
        402000,
        403000,
        404000,
        405000,
        406000,
        407000,
        499999
    )
AND BranchCode = 'WP'
AND TDate >= '2016-01-01'
AND TDate <= '2016-12-31'
GROUP BY
    ProjectCode

第二

SELECT
            ProjectCode,
            SUM (- 1 *(CreditAm) +(DebitAm)) AS Materials
        FROM
            [dbo].[AcDetail]
        WHERE
            AcCode IN (600001, 600002, 600151)
        AND BranchCode = 'WP'
        AND TDate >= '2016-01-01'
        AND TDate <= '2016-12-31'
        GROUP BY
            ProjectCode

第三

SELECT
                ProjectCode,
                SUM (- 1 *(CreditAm) +(DebitAm)) AS Salaries
            FROM
                [dbo].[AcDetail]
            WHERE
                AcCode IN (
                    650001,
                    650005,
                    650006,
                    650007,
                    650008,
                    650009,
                    650010,
                    650020,
                    650021,
                    650022,
                    650023,
                    650024,
                    650025,
                    650026,
                    650027
                )
            AND BranchCode = 'WP'
            AND TDate >= '2016-01-01'
            AND TDate <= '2016-12-31'
            GROUP BY
                ProjectCode
            ORDER BY
                ProjectCode

2 个答案:

答案 0 :(得分:0)

使用Conditional SUM。仅在Accode匹配列表

时对值求和
SELECT ProjectCode,
       Sum (CASE
              WHEN AcCode IN ( '401000', '402000', '403000', '404000',
                               '405000', '406000', '407000', '499999' ) THEN -1 * ( CreditAm ) + ( DebitAm )
              ELSE 0
            END) AS Balance,
       Sum (CASE
              WHEN AcCode IN ( '600001', '600002', '600151' ) THEN -1 * ( CreditAm ) + ( DebitAm )
              ELSE 0
            END) AS Materials,
       Sum (CASE
              WHEN AcCode IN ( '650001', '650005', '650006', '650007',
                               '650008', '650009', '650010', '650020',
                               '650021', '650022', '650023', '650024',
                               '650025', '650026', '650027' ) THEN -1 * ( CreditAm ) + ( DebitAm )
              ELSE 0
            END) AS Salaries
FROM   [dbo].[AcDetail]
WHERE  AcCode IN ( '401000', '402000', '403000', '404000',
                   '405000', '406000', '407000', '499999',
                   '600001', '600002', '600151', '650001',
                   '650005', '650006', '650007', '650008',
                   '650009', '650010', '650020', '650021',
                   '650022', '650023', '650024', '650025',
                   '650026', '650027' )
GROUP  BY ProjectCode 

答案 1 :(得分:0)

我们可以使用OUTER APPLY完成此操作,并为每列设置不同的设置,如下所示:

SELECT D.ProjectCode,
    ISNULL(SUM(B.Balance), 0) AS Balance,
    ISNULL(SUM(M.Materials), 0) AS Materials,
    ISNULL(SUM(S.Salaries), 0) AS Salaries
FROM [dbo].[AcDetail] AS D
OUTER APPLY (SELECT (- 1 *(CreditAm) +(DebitAm)) AS Balance
             FROM [dbo].[AcDetail]
             WHERE AcCode IN ('401000', '402000', '403000', '404000',
                               '405000', '406000', '407000', '499999')
                AND AcCode = D.AcCode
                AND TDate = D.TDate
                AND ProjectCode = D.ProjectCode) AS B --Balance
OUTER APPLY (SELECT (- 1 *(CreditAm) +(DebitAm)) AS Materials
             FROM [dbo].[AcDetail]
             WHERE AcCode IN ('600001', '600002', '600151')
                AND AcCode = D.AcCode
                AND TDate = D.TDate
                AND ProjectCode = D.ProjectCode) AS M -- Materials            
OUTER APPLY (SELECT (- 1 *(CreditAm) +(DebitAm)) AS Salaries
            FROM [dbo].[AcDetail]
            WHERE AcCode IN ('650001', '650005', '650006', '650007', '650008', '650009', 
                            '650010', '650020','650021', '650022', '650023', '650024',
                            '650025', '650026', '650027')
                AND AcCode = D.AcCode
                AND TDate = D.TDate
                AND ProjectCode = D.ProjectCode) AS S --Salary
WHERE D.BranchCode = 'WP'
AND D.AcCode IN ('401000', '402000', '403000', '404000', '405000', '406000', '407000', 
    '499999','600001', '600002', '600151', '650001', '650005', '650006', '650007', 
    '650008','650009', '650010', '650020', '650021', '650022', '650023', '650024', 
    '650025','650026', '650027')
AND D.TDate >= '2016-01-01'
AND D.TDate <= '2016-12-31'
GROUP BY D.ProjectCode
ORDER BY D.ProjectCode