SQL 根据条件进行比较和累加的代码
SQL Code to compare and do cumulative based on condition
如图:
这里我需要根据一个条件进行累加:
我有
Column 1: Sales Date
Column 2: Warranty End Date
Column 3: Qty of Sales
Column 4: Cumulative Sales Qty
现在第 5 列:保修期内,此处给出了错误的值
当保修日期完成 365 天(到期)时,我需要减去保修计数列中该到期日期发生的销售额,类似于保修到期后接下来几天的计数开始减少。
例如图中:
2014 年 1 月 1 日到 2015 年 1 月 1 日累计销售额为 246,我需要从 '96502' 中减去 '246',即截至 2015 年 1 月 1 日的累计销售额。所以应该是 96256
我们如何实现 SQL 中 'Under warranty count' 列的逻辑
我的查询:
SELECT a."sales_year",
a."sales_billing_date",
a."warranty_end_date",
a."sum_val",
a."order_qty",
CASE
WHEN Sum(Days_between (a."warranty_end_date", a."sales_billing_date"))
< 365
THEN a."sum_val"
ELSE ( ( a."sum_val" ) - ( b."sum_val" ) )
END AS "Under_Warranty"
FROM "_SYS_BIC"."pal/cv_pal_tbf_sales" a,
"_SYS_BIC"."pal/cv_pal_tbf_sales" b
GROUP BY a."sales_year",
a."sales_billing_date",
a."warranty_end_date",
a."order_qty",
b."sum_val",
a."sum_val";
假设 SALES_BILLING_DATE
AND WARRANTY_END_DATE
在整个 table 中相隔 1 年,您可以通过匹配 [=21= 的每个实例中的以上两列来进行自连接] 并对 UNDER_WARRANTY
金额进行减法。
SELECT A.SALES_YEAR, A.SALES_BILLING_DATE, A.WARRANTY_END_DATE, A.SUM_VAL, A.ORDER_QTY,
(A.UNDER_WARRANTY - B.UNDER_WARRANTY) AS UNDER_WARRANTY_NEW
FROM
YOUR_TABLE A
INNER JOIN
YOUR_TABLE B
ON A.SALES_BILLING_DATE = B.WARRANTY_END_DATE;
要在输出中保留 2014 项,请尝试以下查询。更改为具有相同 ON
条件的左连接,如果没有匹配项,则 UNDER_WARRANTY
数量保持不变。
SELECT A.SALES_YEAR, A.SALES_BILLING_DATE, A.WARRANTY_END_DATE, A.SUM_VAL, A.ORDER_QTY,
CASE WHEN B.WARRANTY_END_DATE IS NOT NULL THEN (A.UNDER_WARRANTY - B.UNDER_WARRANTY) ELSE A.UNDER_WARRANTY END AS UNDER_WARRANTY_NEW
FROM
YOUR_TABLE A
LEFT JOIN
YOUR_TABLE B
ON A.SALES_BILLING_DATE = B.WARRANTY_END_DATE;
如图:
这里我需要根据一个条件进行累加:
我有
Column 1: Sales Date
Column 2: Warranty End Date
Column 3: Qty of Sales
Column 4: Cumulative Sales Qty
现在第 5 列:保修期内,此处给出了错误的值 当保修日期完成 365 天(到期)时,我需要减去保修计数列中该到期日期发生的销售额,类似于保修到期后接下来几天的计数开始减少。
例如图中: 2014 年 1 月 1 日到 2015 年 1 月 1 日累计销售额为 246,我需要从 '96502' 中减去 '246',即截至 2015 年 1 月 1 日的累计销售额。所以应该是 96256
我们如何实现 SQL 中 'Under warranty count' 列的逻辑
我的查询:
SELECT a."sales_year",
a."sales_billing_date",
a."warranty_end_date",
a."sum_val",
a."order_qty",
CASE
WHEN Sum(Days_between (a."warranty_end_date", a."sales_billing_date"))
< 365
THEN a."sum_val"
ELSE ( ( a."sum_val" ) - ( b."sum_val" ) )
END AS "Under_Warranty"
FROM "_SYS_BIC"."pal/cv_pal_tbf_sales" a,
"_SYS_BIC"."pal/cv_pal_tbf_sales" b
GROUP BY a."sales_year",
a."sales_billing_date",
a."warranty_end_date",
a."order_qty",
b."sum_val",
a."sum_val";
假设 SALES_BILLING_DATE
AND WARRANTY_END_DATE
在整个 table 中相隔 1 年,您可以通过匹配 [=21= 的每个实例中的以上两列来进行自连接] 并对 UNDER_WARRANTY
金额进行减法。
SELECT A.SALES_YEAR, A.SALES_BILLING_DATE, A.WARRANTY_END_DATE, A.SUM_VAL, A.ORDER_QTY,
(A.UNDER_WARRANTY - B.UNDER_WARRANTY) AS UNDER_WARRANTY_NEW
FROM
YOUR_TABLE A
INNER JOIN
YOUR_TABLE B
ON A.SALES_BILLING_DATE = B.WARRANTY_END_DATE;
要在输出中保留 2014 项,请尝试以下查询。更改为具有相同 ON
条件的左连接,如果没有匹配项,则 UNDER_WARRANTY
数量保持不变。
SELECT A.SALES_YEAR, A.SALES_BILLING_DATE, A.WARRANTY_END_DATE, A.SUM_VAL, A.ORDER_QTY,
CASE WHEN B.WARRANTY_END_DATE IS NOT NULL THEN (A.UNDER_WARRANTY - B.UNDER_WARRANTY) ELSE A.UNDER_WARRANTY END AS UNDER_WARRANTY_NEW
FROM
YOUR_TABLE A
LEFT JOIN
YOUR_TABLE B
ON A.SALES_BILLING_DATE = B.WARRANTY_END_DATE;