简体   繁体   中英

Pervasive PSQL GROUP BY Clause

I have the following following SQL call that I make on a Pervasive V11 database. I'm looking to work it so that I only get one line for each Item Id.

SELECT 
    inventory_history.item_id AS 'ItemId', 
    RTrim(inventory_items.item_name) AS 'Description', 
    If(RTrim(trx_type) = 'P',SUM(change_quantity),'') AS 'QtyChangeP', 
    If(RTrim(trx_type) = 'P',SUM(history_cost_01+history_cost_02+history_cost_03+history_cost_04+history_cost_05+history_cost_06+history_cost_07+history_cost_08+history_cost_09+history_cost_10+history_cost_11+history_cost_12),'') AS 'CostChangeP', 
    If(RTrim(trx_type) = 'S',SUM(change_quantity),'') AS 'QtyChangeS', 
    If(RTrim(trx_type) = 'S',SUM(history_cost_01+history_cost_02+history_cost_03+history_cost_04+history_cost_05+history_cost_06+history_cost_07+history_cost_08+history_cost_09+history_cost_10+history_cost_11+history_cost_12),'') AS 'CostChangeS', 
    If(RTrim(trx_type) = 'A',SUM(change_quantity),'') AS 'QtyChangeA', 
    If(RTrim(trx_type) = 'A',SUM(history_cost_01+history_cost_02+history_cost_03+history_cost_04+history_cost_05+history_cost_06+history_cost_07+history_cost_08+history_cost_09+history_cost_10+history_cost_11+history_cost_12),'') AS 'CostChangeA', 
    If(RTrim(trx_type) = 'T',SUM(change_quantity),'') AS 'QtyChangeT', 
    If(RTrim(trx_type) = 'T',SUM(history_cost_01+history_cost_02+history_cost_03+history_cost_04+history_cost_05+history_cost_06+history_cost_07+history_cost_08+history_cost_09+history_cost_10+history_cost_11+history_cost_12),'') AS 'CostChangeT', 
    If(RTrim(inventory_categories.stocked_by_factor) = 'FT',inventory_items.unit_weight,'') AS 'WtPerFt' 
FROM 
    inventory_history 
INNER JOIN 
    inventory_items ON inventory_history.item_id = inventory_items.item_id 
INNER JOIN 
    inventory_categories ON inventory_items.category_id = inventory_categories.category_id 
WHERE 
    trx_date>'20170731' 
GROUP BY 
    inventory_history.item_id, inventory_items.item_name, trx_type, stocked_by_factor, unit_weight;

As it is now, I receive an error from the database if I don't have trx_type, stocked_by_factor, or unit_weight listed in the Group By clause.

Removing those fields results in this error:

Column invalid. Must be a group by column: trx_type in SELECT LIST.

Here are sample results of the complete SQL call:

ItemId                      Description                                                                                                            QtyChangeP                                                                    CostChangeP                                                                     QtyChangeS                                                                    CostChangeS                                                                     QtyChangeA                                                                    CostChangeA                                                                     QtyChangeT                                                                    CostChangeT          WtPerFt
=========================   ==================================================   ============================================================================   ============================================================================   ============================================================================   ============================================================================   ============================================================================   ============================================================================   ============================================================================   ============================================================================   ==============
1100SM19050T2C1             1100-H19 LAMI SHIM .050"  TYPE 2, CLASS 1                                                                                 58.2400                                                                         890.00                                                                         0.0000                                                                           0.00                                                                         0.0000                                                                           0.00                                                                         0.0000                                                                           0.00         0.000000
1100SM19050T2C1             1100-H19 LAMI SHIM .050"  TYPE 2, CLASS 1                                                                                  0.0000                                                                           0.00                                                                        58.2400                                                                         890.00                                                                         0.0000                                                                           0.00                                                                         0.0000                                                                           0.00         0.000000
1100SM19085T2C1             1100-H19 LAMI SHIM .085"  TYPE 2, CLASS 1                                                                                  0.0000                                                                           0.00                                                                         0.0000                                                                           0.00                                                                         0.0000                                                                           0.00                                                                         0.0000                                                                           0.00         0.000000
1100SM19085T2C1             1100-H19 LAMI SHIM .085"  TYPE 2, CLASS 1                                                                                 19.8080                                                                         208.00                                                                         0.0000                                                                           0.00                                                                         0.0000                                                                           0.00                                                                         0.0000                                                                           0.00         0.000000
1100SM19085T2C1             1100-H19 LAMI SHIM .085"  TYPE 2, CLASS 1                                                                                  0.0000                                                                           0.00                                                                        19.8080                                                                         208.00                                                                         0.0000                                                                           0.00                                                                         0.0000                                                                           0.00         0.000000

Any help is greatly appreciated. Thanks!!

The condition should be the argument to the sum() :

sum(If(RTrim(trx_type) = 'P', change_quantity), 0) AS QtyChangeP, 

Normally, this would be written using case :

sum(case when RTrim(trx_type) = 'P' then change_quantity else 0 end) AS QtyChangeP, 

Never mind... after hours of racking my brain, the answer was right in front of me. I just needed to turn the If() functions into SUM() functions.

Here's the working call:

SELECT 
    inventory_history.item_id AS 'ItemId', 
    RTrim(inventory_items.item_name) AS 'Description', 
    SUM(If(RTrim(trx_type) = 'P',inventory_history.change_quantity,0)) AS 'QtyChangeP', 
    SUM(If(RTrim(trx_type) = 'P',(history_cost_01+history_cost_02+history_cost_03+history_cost_04+history_cost_05+history_cost_06+history_cost_07+history_cost_08+history_cost_09+history_cost_10+history_cost_11+history_cost_12),0)) AS 'CostChangeP', 
    SUM(If(RTrim(trx_type) = 'S',inventory_history.change_quantity,0)) AS 'QtyChangeS', 
    SUM(If(RTrim(trx_type) = 'S',(history_cost_01+history_cost_02+history_cost_03+history_cost_04+history_cost_05+history_cost_06+history_cost_07+history_cost_08+history_cost_09+history_cost_10+history_cost_11+history_cost_12),0)) AS 'CostChangeS', 
    SUM(If(RTrim(trx_type) = 'A',inventory_history.change_quantity,0)) AS 'QtyChangeA', 
    SUM(If(RTrim(trx_type) = 'A',(history_cost_01+history_cost_02+history_cost_03+history_cost_04+history_cost_05+history_cost_06+history_cost_07+history_cost_08+history_cost_09+history_cost_10+history_cost_11+history_cost_12),0)) AS 'CostChangeA', 
    SUM(If(RTrim(trx_type) = 'T',inventory_history.change_quantity,0)) AS 'QtyChangeT', 
    SUM(If(RTrim(trx_type) = 'T',(history_cost_01+history_cost_02+history_cost_03+history_cost_04+history_cost_05+history_cost_06+history_cost_07+history_cost_08+history_cost_09+history_cost_10+history_cost_11+history_cost_12),0)) AS 'CostChangeT', 
    If(RTrim(inventory_categories.stocked_by_factor) = 'FT',inventory_items.unit_weight,'') AS 'WtPerFt' 
FROM 
    inventory_history 
INNER JOIN 
    inventory_items ON inventory_history.item_id = inventory_items.item_id 
INNER JOIN 
    inventory_categories ON inventory_items.category_id = inventory_categories.category_id 
WHERE 
    trx_date>'20170731' 
GROUP BY 
    inventory_history.item_id, inventory_items.item_name, stocked_by_factor, unit_weight;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM