我有来自查询的数据。我最初用SQL过滤数据,但我不确定我的老板希望我在SQL中做什么。
我想计算C列中的值,如果" LOAD_BEER"在D栏。
按人员(第F列)和按日(第E列)分组数据。
然后,取每个人的统计数字,并将其除以当天该人的C栏中所有值的总和。
如果该值大于0.8,请获取当天所有该人的数据,并将其移至新工作表。
以下是我使用的数据示例:
以下是我使用的SQL:
SELECT TALLY_TRAN_MSTR.LOGON_ID, SUM(TALLY_TRAN_MSTR.FULL_PLLT_QTY), TALLY_TRAN_MSTR.SHIFT_DT,TALLY_TRAN_MSTR.SHIFT_NBR
FROM WBR_RW.TALLY_TRAN_MSTR
WHERE (TALLY_TRAN_MSTR.PRI_GRP_CD='LOAD_BEER')
GROUP BY TALLY_TRAN_MSTR.LOGON_ID, TALLY_TRAN_MSTR.SHIFT_DT, TALLY_TRAN_MSTR.SHIFT_NBR
SQL显示任何具有" LOAD_BEER"的数据,但它不会计算所有内容,除以它,并查看它是否大于0.8。
我尝试做的一个例子是(手动计算)
Stevens在2017年6月15日有7件与他的名字相关的物品。其中3个是" LOAD_BEER"。 LOAD_BEER总和为165.所有7项的总和为181. 165/181 = 0.91。 0.91> 0.80,所以我想将所有7个数据点移动到新的位置,无论是在新选项卡上还是在我目前所在的选项卡上的其他位置。
我的问题是:
我试图在SQL中做什么?
1.5。如果是,我该如何制作一个公式呢?
在VBA中这样做会更容易吗?
2.5。如果是这样,那么开始的好地方是什么?
答案 0 :(得分:2)
将有更多子查询来满足您的所有要求。以下查询将从您的表中提取所有记录(例如tab_beer - 将其更改为您的表名),并使用生成的数据,您现在可以将其传输到选项卡或VBA中的任何位置或您使用的任何工具
const assertRole = ( ...roles ) => ( req, res, next ) =>
req.user && roles.includes( req.user.role ) ? next() : res.sendStatus( 403 ) );
todoRoutes.get("/admin/view1", authenticate, assertRole( "user", "editor", "admin" ), TodoController.getTodos );
结果
WITH cte AS
(
SELECT
a.logon_id,
a.shift_dt,
a.shift_nbr,
CASE
WHEN CAST(a.tally_qty AS DECIMAL(12,2))/CAST(b.total_qty AS DECIMAL(12,2)) > 0.8
THEN 'Y'
ELSE 'N'
END inc_flg
FROM
(SELECT
logon_id,
SUM(full_pllt_qty) tally_qty,
shift_dt,
shift_nbr
FROM
tab_beer
WHERE
pri_grp_cd = 'LOAD_BEER'
GROUP BY
logon_id, shift_dt, shift_nbr) a
INNER JOIN
(SELECT
logon_id,
SUM(full_pllt_qty) total_qty,
shift_dt,
shift_nbr
FROM
tab_beer
GROUP BY
logon_id, shift_dt, shift_nbr) b ON a.logon_id = b.logon_id
)
SELECT t.*
FROM tab_beer t
INNER JOIN cte c ON t.logon_id = c.logon_id
WHERE t.shift_dt = c.shift_dt
AND t.shift_nbr = c.shift_nbr
AND c.inc_flg = 'Y'