开发者

Conditional Union in T-SQL

Currently I've a query as follows:

-- Query 1
SELECT
    acc_code, acc_name, alias, LAmt, coalesce(LAmt,0) AS amt 
FROM 
    (SELECT 
        acc_code, acc_name, alias, 
        (SELECT 
            (SUM(cr_amt)-SUM(dr_amt)) 
        FROM 
            ledger_mcg l
        WHERE 
            (l.acc_code LIKE a.acc_code + '.%' OR l.acc_code=a.acc_code) 
        AND 
            fy_id=1 
        AND
            posted_date BETWEEN '2010-01-01' AND '2011-06-02') AS LAmt 
    FROM
        acc_head_mcg AS a 
    WHERE 
    (acc_type='4')) AS T1
WHERE 
    coalesce(LAmt,0)<>0

Query 2 is same as Query 1 except that acc_type = '5' in Query 2. Query 2 always returns a resultset with a single row. Now, I need the union of the two queries i.e

Query 1 
UNION
Query 2

only when the amt returned by Query 2 is less than 0. Else, I don't need a uni开发者_JAVA技巧on but only the resulset from Query 1.

The best way I can think of is to create a parameterised scalar function. How best can I do this?


You could store the result of the first query into a temporary table, then, if the table wasn't empty, execute the other query.

IF OBJECT_ID('tempdb..#MultipleQueriesResults') IS NOT NULL
  DROP TABLE #MultipleQueriesResults;

SELECT
    acc_code, acc_name, alias, LAmt, coalesce(LAmt,0) AS amt 
INTO #MultipleQueriesResults
FROM 
    (SELECT 
        acc_code, acc_name, alias, 
        (SELECT 
            (SUM(cr_amt)-SUM(dr_amt)) 
        FROM 
            ledger_mcg l
        WHERE 
            (l.acc_code LIKE a.acc_code + '.%' OR l.acc_code=a.acc_code) 
        AND 
            fy_id=1 
        AND
            posted_date BETWEEN '2010-01-01' AND '2011-06-02') AS LAmt 
    FROM
        acc_head_mcg AS a 
    WHERE 
    (acc_type='4')) AS T1
WHERE 
    coalesce(LAmt,0)<>0;

IF NOT EXISTS (SELECT * FROM #MultipleQueriesResults)
  … /* run Query 2 */
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜