Postgresql - 根据另一列的选择标准返回其他列

时间:2014-08-22 19:31:16

标签: sql postgresql postgresql-9.1

我是postgresql的新手,所以我甚至不知道我是否走在正确的轨道上。这就是我想要的结果:             Web Web其他Dist Dist     周数销售额销售额销售数量

8/18/2014   1120   74436.60    1068   38516.44   28034   244504.64
8/4/2014    653    39850.225  34726  476872.65    7962   255772.98
7/28/2014   760    40740.295  28009  950602.16    3222   145952.57
7/21/2014   913     48877.47  34082 1286582.67    6332   247922.63
7/14/2014   977     79177.73  22147  828173.65   21542   286437.43
7/7/2014    918     58949.72  49302 1253558.70    4129   211738.23

记录按周汇总,并从1列和1个计算列创建:1。订单数量2.订单数量*单价。我使用case语句根据销售类型或Customer类型将它们分成不同的列。 (销售类型INT = Web,销售类型非INT =其他,客户类型DIST = Dist)

我使用的代码如下所示。

SELECT 
cast(date_trunc('week', cohead_orderdate) AS date) AS week, 

-- Web Quantity Sold
CASE WHEN saletype_code = 'INT' THEN
SUM(invcitem_billed) 
END AS web_qty, 

-- Web $ Sales
CASE WHEN saletype_code = 'INT' THEN
SUM(invcitem_billed * invcitem_price)
END AS web_sales,

-- All Other Quantities Sold (phone, fax, email, etc.)
CASE WHEN saletype_code != 'INT' THEN
SUM(invcitem_billed) 
END AS other_qty, 

-- All Other $ Sales (phone, fax, email, etc.)
CASE WHEN saletype_code != 'INT' THEN
SUM(invcitem_billed * invcitem_price)
END AS other_sales,

-- Dist Quantities Sold 
CASE WHEN custtype_code = 'DIST' THEN
SUM(invcitem_billed) 
END AS dist_qty, 

-- Dist Other $ Sales
CASE WHEN custtype_code = 'DIST'  THEN
SUM(invcitem_billed * invcitem_price)
END AS dist_sales

FROM cohead ordhdr
LEFT JOIN saletype ON (cohead_saletype_id = saletype_id) 
LEFT JOIN custinfo ON (cohead_cust_id = cust_id)
LEFT JOIN custtype ON (cust_custtype_id = custtype_id)
JOIN invchead invhdr ON ordhdr.cohead_number = invhdr.invchead_ordernumber
JOIN invcitem invdtl ON invhdr.invchead_id = invdtl.invcitem_invchead_id
WHERE (cohead_status != 'X')
AND (cohead_orderdate >= <? value('startDate') ?>) 
AND (cohead_orderdate <= <? value('endDate') ?>)
GROUP BY week,
saletype_code,
custtype_code

ORDER BY week DESC;

问题是它希望我在GROUP BY子句中包含我用于我的选择标准的销售类型和客户类型,这显然创建了几个分组,因此每周有几个记录。

Week       Web         Web      Other      Other      Dist  Dist
           Qty        Sales      Qty       Sales      Qty    Sales
8/4/2014      0           0       29      922.65        29  922.65
8/4/2014      0           0      575           0         0          0
8/4/2014      0           0      208    12098.16         0          0
8/4/2014      0           0       20      630.00         0          0
8/4/2014      0           0      858    34892.97       858   34892.97
8/4/2014      0           0      574    29017.78         0          0
8/4/2014    155    10605.00        0           0         0          0
7/28/2014     0           0      546           0         0          0
7/28/2014     0           0      579    29443.98         0          0
7/28/2014     0           0     1645    68356.15      1645   68356.15
7/28/2014     0           0      888    45794.48         0          0
7/28/2014   346    23638.16        0           0         0          0
7/21/2014     0           0       14      827.00         0          0
7/21/2014     0           0      106           0       106          0
7/21/2014     0           0      227      348.10         0          0
7/21/2014     0           0      361    22503.91         0          0
7/21/2014     0           0     3050   119407.24      3050  119407.24
7/21/2014     0           0      448    27735.26         0          0
7/21/2014   288    17139.08        0           0         0          0
7/21/2014     0           0       20      704.00         0          0
7/21/2014     0           0        3           0         0          0

这是我在此提交的第一个问题,所以我希望我已经提交了足够(但不是太多)的信息。我会感谢您提供的任何帮助/建议。 感谢名单!!!

1 个答案:

答案 0 :(得分:0)

代替

CASE WHEN saletype_code = 'INT' THEN
SUM(invcitem_billed) 
END AS web_qty,

sum(
    CASE
        WHEN saletype_code = 'INT' THEN invcitem_billed
    END
) AS web_qty,