根据Excel中的计算过滤数据

时间:2017-08-14 18:41:48

标签: sql sql-server excel vba

我有来自查询的数据。我最初用SQL过滤数据,但我不确定我的老板希望我在SQL中做什么。

我想计算C列中的值,如果" LOAD_BEER"在D栏。

按人员(第F列)和按日(第E列)分组数据。

然后,取每个人的统计数字,并将其除以当天该人的C栏中所有值的总和。

如果该值大于0.8,请获取当天所有该人的数据,并将其移至新工作表。

以下是我使用的数据示例:

enter image description here

以下是我使用的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个数据点移动到新的位置,无论是在新选项卡上还是在我目前所在的选项卡上的其他位置。

我的问题是:

  1. 我试图在SQL中做什么?

    1.5。如果是,我该如何制作一个公式呢?

  2. 在VBA中这样做会更容易吗?

    2.5。如果是这样,那么开始的好地方是什么?

1 个答案:

答案 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'