Search code examples
sqlexcelselectunioncreate-table

SQL - How To Move UNION Query Results Into A New Table?


I have a sample query below that works fine before trying to move it into a new table:

SELECT CONVERT(DATE,a.ins_timestamp) AS 'Date',  
a.Prod_code, 
a.Curr_boxes, 
a.Label_barcode, 
b.From_ord_no, 
NULL AS To_ord_no, 
CASE
    WHEN a.From_batch >= a.To_batch THEN a.From_batch 
    WHEN a.To_batch >= a.From_batch THEN a.To_batch 
    ELSE                             a.From_batch
END AS 'Batch',  
a.Weight, 
'IN' AS 'Direction' 

FROM a 

JOIN  b ON a.Label_barcode = b.Label_barcode 

WHERE (a.ins_timestamp Between ? And ?) AND (a.To_batch = ?) AND (a.From_batch = 0) AND (a.Type='Consumption') AND (a.To_status<>'STOCK') AND (b.From_status = 'PORDER') 

GROUP BY CONVERT(DATE,a.ins_timestamp),  
a.Prod_code, 
a.Curr_boxes, 
a.Label_barcode, 
b.From_ord_no, 
a.From_batch, 
a.To_batch, 
a.Weight, 
a.From_status,
a.To_status

    union 

SELECT CONVERT(DATE,b.ins_timestamp) AS 'Date',  
b.Prod_code, 
b.Curr_boxes, 
b.Label_barcode, 
NULL AS From_ord_no, 
NULL AS To_ord_no, 
CASE
    WHEN b.From_batch >= b.To_batch THEN b.From_batch 
    WHEN b.To_batch >= b.From_batch THEN b.To_batch 
    ELSE                             b.From_batch
END AS 'Batch',  
b.Weight, 
'IN' AS 'Direction' 

FROM b 

WHERE (b.From_batch = 0) AND (b.Type='Consumption') AND (b.ins_timestamp Between ? And ?) AND (b.To_batch = ?) AND (b.To_status<>'STOCK') 

GROUP BY CONVERT(DATE,b.ins_timestamp),  
b.Prod_code, 
b.Curr_boxes, 
b.Label_barcode,  
b.From_batch, 
b.To_batch, 
b.Weight, 
b.From_status,
b.To_status

How do i move these two queries into a new table? Please note that I am using a SQL query into an Excel spreadsheet.

I have tried the following... but i keep on getting an error saying 'Invalid Parameter Number' and 'Invalid Descriptor Index'

CREATE TABLE temp_UNION AS 
( 
SELECT CONVERT(DATE,a.ins_timestamp) AS 'Date',  
a.Prod_code, 
a.Curr_boxes, 
a.Label_barcode, 
b.From_ord_no, 
NULL AS To_ord_no, 
CASE
    WHEN a.From_batch >= a.To_batch THEN a.From_batch 
    WHEN a.To_batch >= a.From_batch THEN a.To_batch 
    ELSE                             a.From_batch
END AS 'Batch',  
a.Weight, 
'IN' AS 'Direction' 

FROM a 

JOIN  b ON a.Label_barcode = b.Label_barcode 

WHERE (a.ins_timestamp Between ? And ?) AND (a.To_batch = ?) AND (a.From_batch = 0) AND (a.Type='Consumption') AND (a.To_status<>'STOCK') AND (b.From_status = 'PORDER') 

GROUP BY CONVERT(DATE,a.ins_timestamp),  
a.Prod_code, 
a.Curr_boxes, 
a.Label_barcode, 
b.From_ord_no, 
a.From_batch, 
a.To_batch, 
a.Weight, 
a.From_status,
a.To_status

    union 

SELECT CONVERT(DATE,b.ins_timestamp) AS 'Date',  
b.Prod_code, 
b.Curr_boxes, 
b.Label_barcode, 
NULL AS From_ord_no, 
NULL AS To_ord_no, 
CASE
    WHEN b.From_batch >= b.To_batch THEN b.From_batch 
    WHEN b.To_batch >= b.From_batch THEN b.To_batch 
    ELSE                             b.From_batch
END AS 'Batch',  
b.Weight, 
'IN' AS 'Direction' 

FROM b 

WHERE (b.From_batch = 0) AND (b.Type='Consumption') AND (b.ins_timestamp Between ? And ?) AND (b.To_batch = ?) AND (b.To_status<>'STOCK') 

GROUP BY CONVERT(DATE,b.ins_timestamp),  
b.Prod_code, 
b.Curr_boxes, 
b.Label_barcode,  
b.From_batch, 
b.To_batch, 
b.Weight, 
b.From_status,
b.To_status
) 

Any suggestions would be greatly appreciated!

Thanks, Jordan


Solution

  • You can do a SELECT INTO instead, which is actually easily done in an Excel spreadsheet.

    It's important to note that to actually create a 'temporary' table, the hashtag is key when naming your temp table, i.e. #newtable (as seen in below code).

    A union in the case of this problem is actually needed. You can first select your first query into your #newtable and then, after it has been created, you can select your second query into the very same table.

    Please see below for the code:

    -- First create your temp table 
    SELECT CONVERT(DATE,a.ins_timestamp) AS 'Date',  
    a.Prod_code, 
    a.Curr_boxes, 
    a.Label_barcode, 
    b.From_ord_no, 
    NULL AS To_ord_no, 
    CASE
        WHEN a.From_batch >= a.To_batch THEN a.From_batch 
        WHEN a.To_batch >= a.From_batch THEN a.To_batch 
        ELSE                             a.From_batch
    END AS 'Batch',  
    a.Weight, 
    'IN' AS 'Direction' 
    
    INTO #newtable 
    
    FROM a 
    
    JOIN b ON a.Label_barcode = b.Label_barcode 
    
    WHERE (a.ins_timestamp Between ? And ?) AND (a.To_batch = ?) AND (a.From_batch = 0) AND (a.Type='Consumption') AND (a.To_status<>'STOCK') AND (b.From_status = 'PORDER') 
    
    -- Now we insert the second query into the already created table
        INSERT INTO #newtable 
    
    SELECT CONVERT(DATE,b.ins_timestamp) AS 'Date',  
    b.Prod_code, 
    b.Curr_boxes, 
    b.Label_barcode, 
    NULL AS From_ord_no, 
    NULL AS To_ord_no, 
    CASE
        WHEN b.From_batch >= b.To_batch THEN b.From_batch 
        WHEN b.To_batch >= b.From_batch THEN b.To_batch 
        ELSE                             b.From_batch
    END AS 'Batch',  
    b.Weight, 
    'IN' AS 'Direction' 
    
    FROM b 
    
    WHERE (b.From_batch = 0) AND (b.Type='Consumption') AND (b.ins_timestamp Between ? And ?) AND (b.To_batch = ?) AND (b.To_status<>'STOCK') 
    
    -- Now we can select whatever we want from our temp table
    SELECT Date,  
        Prod_code, 
        Curr_boxes, 
        Label_barcode, 
        max(From_ord_no) From_ord_no, 
        To_ord_no, 
        Batch,  
        Weight, 
        Direction 
    
    FROM #newtable 
    
    GROUP BY Date,  
        Prod_code, 
        Curr_boxes, 
        Label_barcode, 
        To_ord_no, 
        Batch,  
        Weight, 
        Direction