Sql server 基于聚合函数和案例函数创建计算值

Sql server 基于聚合函数和案例函数创建计算值,sql-server,Sql Server,我正在处理下面的查询,并希望将其用作Tableau中的数据源-我需要的字段是'SUM_ORDERS'/'SUM_FCST'-在给定聚合函数和Case函数的情况下,在下面的查询中是否有计算该值的方法?似乎无法划分整个聚合或新字段的名称(即“总和”),提前感谢 SELECT M.MATERIAL, M.MATERIAL_DESCRIPTION, M.MATERIAL_AVAILABILITY_DATE, SUM(CASE WHEN M.REQUIR

我正在处理下面的查询,并希望将其用作Tableau中的数据源-我需要的字段是'SUM_ORDERS'/'SUM_FCST'-在给定聚合函数和Case函数的情况下,在下面的查询中是否有计算该值的方法?似乎无法划分整个聚合或新字段的名称(即“总和”),提前感谢

SELECT  M.MATERIAL, 
        M.MATERIAL_DESCRIPTION,
        M.MATERIAL_AVAILABILITY_DATE,
        SUM(CASE WHEN M.REQUIREMENT_TYPE = 'PB' THEN M.QUANTITY ELSE 0 END) AS 'SUM_FCST',
        SUM(CASE WHEN M.REQUIREMENT_TYPE IN('01','04','KE') THEN M.QUANTITY ELSE 0 END) AS 'SUM_ORDERS',
        A.Product_Division, 
        A.BU_Group, 
        A.Business_Segment,
        A.Gender


FROM   VW_MRP_ALLOCATION M 
LEFT OUTER JOIN   vw_Article_Attributes A ON M.MATERIAL = A.Article

WHERE  M.REQUIREMENT_CATEGORY IN ('A60381000', 'A60382000')
AND    M.MATERIAL_AVAILABILITY_DATE BETWEEN GETDATE() AND GETDATE() + 90
AND    M.MATERIAL IN ('AA2721',
'AA2723',
'AA5205',
'AA5206',
'AA5207',
'AA5208',
'AA5209',
'AA5210',
'AB3120',
'AB3121',
'AB3131',
'AC5234',
'AC5235',
'AC5236',
'AC5237',
'AC5254',
'AC5256',
'AH9802',
'AH9803',
'AH9804',
'AI3331',
'AI6206',
'AJ5837',
'AJ5838',
'AJ5839',
'AJ5840',
'AJ5841',
'AJ5842',
'AJ5844',
'AJ5846',
'AJ5863',
'AJ5867',
'AJ5869',
'AJ5871',
'AJ5879',
'AJ5880',
'AJ5881',
'AJ5882',
'AJ5883',
'AJ5892',
'AJ5893',
'AJ5894',
'AJ5895',
'AJ5898',
'AJ5899',
'AJ5900',
'AJ5901',
'AJ5915',
'AJ5916',
'AJ5919',
'AN9829',
'AN9848',
'AN9854',
'AN9855',
'AO1612',
'AO1855',
'AP0354',
'AP0356',
'AP0364',
'AP0365',
'AP0366',
'AP0529',
'AP0530',
'AP0531',
'AP0534',
'AP0535',
'AP0536',
'AP0537',
'AP0540',
'AP0541',
'AP0543',
'AP0544',
'AP0545',
'AP0548',
'AP0549',
'AP0551',
'AP0552',
'AP0553',
'AP0554',
'AP0558',
'AP1855',
'AP1856',
'AP1857',
'AP1858',
'AP1859',
'AP1860',
'AP1861',
'AP1862',
'AP1863',
'AP1864',
'AP1865',
'AP1866',
'AP1867',
'AP1868',
'AP1869',
'AP1870',
'AP1871',
'AP1872',
'AP1873',
'AP1874',
'AP1875',
'AP1876',
'AP1877',
'AP1878',
'AP4362',
'AP4363',
'AP4364',
'AP4365',
'AP4366',
'AP4367',
'AP4980',
'AP4981',
'AP4982',
'AP4983',
'AP5204',
'AP5205',
'AP5206',
'AP5207',
'AP5208',
'AP5209',
'AP5210',
'AP5211',
'AP5212',
'AP5648',
'AP5649',
'AP5650',
'AP5651',
'AP5652',
'AX6087',
'AX7043',
'AY1795',
'AY1796',
'AY1839',
'AY2858',
'AY2859',
'AY2867',
'AY2868',
'AY2879',
'AY2881',
'AY2883',
'AY2885',
'AY2886',
'AY2888',
'AY2889',
'AY2890',
'AY2896',
'AY2898',
'AY2983',
'AY2984',
'AZ5389',
'AZ5390',
'AZ5395',
'AZ5396',
'AZ5398',
'AZ5400',
'AZ5402',
'AZ5406',
'B43242',
'B43243',
'B43244',
'B43245',
'B43246',
'B45108',
'B45109',
'B45110',
'B45112',
'B45113',
'BJ9093',
'BJ9095',
'BJ9096',
'BJ9097',
'BJ9098',
'BJ9103',
'BJ9110',
'BJ9111',
'BJ9112',
'BJ9113',
'BJ9114',
'BJ9121',
'BJ9126',
'BJ9127',
'BJ9128',
'BJ9129',
'BJ9131',
'BJ9137',
'BJ9143',
'BJ9144',
'BJ9145',
'BJ9147',
'BJ9148',
'BJ9152',
'BJ9161',
'BJ9163',
'BJ9164',
'BJ9165',
'BJ9166',
'BJ9171',
'BJ9173',
'BJ9174',
'BJ9176',
'BJ9177',
'BJ9179',
'BJ9185',
'BJ9186',
'BJ9189',
'BJ9192',
'BJ9194',
'BJ9195',
'BJ9196',
'BJ9197',
'BJ9198',
'BJ9200',
'BJ9201',
'BJ9202',
'BJ9203',
'BJ9205',
'BJ9206',
'BJ9207',
'BJ9226',
'BJ9228',
'BJ9229',
'BJ9231',
'BJ9294',
'BJ9296',
'BK0292',
'BK0293',
'BK0348',
'BK0350',
'BK0351',
'BK0387',
'BK4765',
'BK4766',
'BK4771',
'BK4772',
'BK4773',
'BK4774',
'BK4775',
'BK4776',
'BK4777',
'BK4778',
'BK4779',
'BK4780',
'BK4781',
'BK4782',
'BK5154',
'BK5428',
'BK5434',
'BK5435',
'BK5437',
'BK5438',
'BK5439',
'BK5444',
'BP5424',
'BP6019',
'BP6022',
'BQ2622',
'BQ2626',
'BQ2628',
'BQ2631',
'BQ2633',
'BQ2634',
'BQ2718',
'BQ2719',
'BQ2722',
'BQ2724',
'BQ2729',
'BQ2730',
'BQ2741',
'BQ2748',
'BQ2749',
'BQ2751',
'BQ2763',
'BQ2765',
'BQ2768',
'BQ2801',
'BQ2806',
'BQ2810',
'BQ2814',
'BQ2815',
'BQ6500',
'BQ7077',
'BQ8196',
'BQ8199',
'BQ8201',
'BQ8243',
'BQ8245',
'BQ8248',
'BR1977',
'BR2701',
'BR2704',
'BR2707',
'BS0042',
'BS0047',
'BS4211',
'BS4212',
'BS4213',
'BS4215',
'BS4216',
'BS4217',
'BS4219',
'BS4224',
'BS4225',
'BS4227',
'BS4228',
'BS4229',
'BS4231',
'BS4232',
'BS4235',
'BS4236',
'BS4237',
'BS4239',
'BS4240',
'BS4241',
'BS4242',
'BS4250',
'BS4252',
'BS4253',
'BS4254',
'BS4256',
'BS4257',
'BS4258',
'BS4260',
'BS4261',
'BS4262',
'BS4264',
'BS4265',
'BS4266',
'BS4268',
'BS4269',
'BS4270',
'BS4271',
'BS4273',
'BS4274',
'BS4275',
'BS4277',
'D84856',
'F82133',
'F82134',
'F82135',
'M35339',
'M35340',
'M35341',
'M64058',
'M64059',
'M64060',
'S04518',
'S05722',
'S05723',
'S05724',
'S05725',
'S05726',
'S05727',
'S05728',
'S05730',
'S05731',
'S05732',
'S05733',
'S05747',
'S05748',
'S05749',
'S05750',
'S05751',
'S05752',
'S05753',
'S05755',
'S05756',
'S05757',
'S05758',
'S16146',
'S16147',
'S16148',
'S16149',
'S16150',
'S16151',
'S16152',
'S16153',
'S16154',
'S16155',
'S16158',
'S16159',
'S16160',
'S16161',
'S16163',
'S16164',
'S17209',
'S17210',
'S17211',
'S17212',
'S17298',
'S17299',
'S17300',
'S17301',
'S17302',
'S17303',
'S17304',
'S17305',
'S17306',
'S17307',
'S17308',
'S17309',
'S17310',
'S17311',
'S17313',
'S17314',
'S22316',
'S22317',
'S22318',
'S22325',
'S22326',
'S22327',
'S22328',
'S22329',
'S22330',
'S22334',
'S22336',
'S22352',
'S22353',
'S22354',
'S22355',
'S22357',
'S22362',
'S22363',
'S22364',
'S22365',
'S22367',
'S22374',
'S22375',
'S22376',
'S22377',
'S22378',
'S22410',
'S22411',
'S22412',
'S22413',
'S22414',
'S29426',
'S29427',
'S29428',
'S29429',
'S29430',
'S86552',
'S86553',
'S86554',
'S86555',
'S86556',
'S86557',
'S86558',
'S86560',
'S86561',
'S86562',
'S86563',
'S86564',
'S86565',
'S86566',
'S86567',
'S86568',
'S86569',
'S86570',
'S86572',
'S86573',
'S86574',
'S86575',
'S92430',
'S92431',
'S92432',
'S92433',
'S92434',
'S92435',
'S92436',
'S92438',
'S92439',
'S92440',
'S92441',
'S92445',
'S92446',
'S92447',
'S92448',
'S92449',
'S92450',
'S92451',
'S92453',
'S92454',
'S92455',
'S92456',
'S93552',
'S93557',
'S96976',
'S96978',
'S99143',
'S99144',
'S99145',
'S99146',
'S99147',
'S99148',
'S99149',
'S99150',
'S99151',
'S99152',
'S99153',
'S99154',
'S99155',
'Z11471',
'Z11474',
'Z11475',
'CD8414',
'CF1045',
'CF1042',
'CF1046',
'CE9563',
'CE9755',
'CD8374',
'CF1047',
'CD8382',
'CF1039',
'CF1049',
'CE9564',
'CD8358',
'CF1044',
'CD8430',
'CE9758',
'CF1036',
'CF1043',
'CF1041',
'CF1038',
'CE9756',
'CF1050',
'CE9759',
'CD8390',
'CD8438',
'CF1037',
'CF1035',
'CD8366',
'CE9565',
'CD8398',
'Z87549')

GROUP BY M.MATERIAL, 
         M.MATERIAL_DESCRIPTION,
         M.MATERIAL_AVAILABILITY_DATE,
         A.BU_Group, 
         A.Business_Segment,
         A.Gender,
         A.Product_Division



ORDER BY M.MATERIAL,
         M.MATERIAL_AVAILABILITY_DATE

您可以使用
NULLIF
来避免“被零除错误”

ISNULL(CAST(SUM(CASE WHEN M.REQUIREMENT_TYPE = 'PB' 
       THEN M.QUANTITY 
       ELSE 0 
    END) as decimal)
/ NULLIF(SUM(CASE 
                 WHEN M.REQUIREMENT_TYPE IN('01','04','KE') THEN M.QUANTITY 
                 ELSE 0 
             END) 
       ,0), 0) AS [SUM_ORDERS/SUM_FCST]

当“SUM_FCST”=0时,返回结果为
NULL
,您可以使用
NULL来避免“被零除错误”

ISNULL(CAST(SUM(CASE WHEN M.REQUIREMENT_TYPE = 'PB' 
       THEN M.QUANTITY 
       ELSE 0 
    END) as decimal)
/ NULLIF(SUM(CASE 
                 WHEN M.REQUIREMENT_TYPE IN('01','04','KE') THEN M.QUANTITY 
                 ELSE 0 
             END) 
       ,0), 0) AS [SUM_ORDERS/SUM_FCST]

当“SUM_FCST”=0时,返回结果为
NULL
,为什么不能对整个聚合进行除法或使用SUM字段的别名。你试过了吗<代码>总和(当M.REQUIREMENT_TYPE IN('01','04','KE')然后M.QUANTITY ELSE 0 END时的情况)/总和(当M.REQUIREMENT_TYPE='PB'然后M.QUANTITY ELSE 0 END时的情况)作为mynewfieldfortableau
感谢您的检查-我确实尝试过,但得到了“被零除”的错误-问题是我需要计算结果返回零-试图找到一种方法来添加一个案例,何时捕捉到这一点-为什么您不能只对整个聚合进行除,或者使用求和字段的别名。你试过了吗<代码>总和(当M.REQUIREMENT_TYPE IN('01','04','KE')然后M.QUANTITY ELSE 0 END时的情况)/总和(当M.REQUIREMENT_TYPE='PB'然后M.QUANTITY ELSE 0 END时的情况)作为mynewfieldfortableau感谢您的检查-我确实尝试过,但得到了“被零除的错误”-问题是我需要计算结果返回零-试图找到一种方法来添加一个案例,当FCST高于SUM_ORDERS/SUM_FCST的情况下,该方法适用于这种情况-但当其中有值时,我仍然得到0后一列-有没有办法得到负数或显示后一列中的数量比比较列中的数量多?如果有帮助,请看图片我想我知道我遗漏了什么,但不确定-我需要计算-即使它为0/0,我只需要它为0-当我检查AC5234时,它在第7个月的数量为255SUM_FCST列,但SUM_ORDERS列中的0-对于如何使该列起作用有点困惑只需将SUM_ORDERS转换为十进制并使用ISNULL。第一个结果是正确的计算-我需要将其反转-即01,04.ke/pb-但当我这样做时,我在关键字ASNULLIF(SUM)上得到一个错误(当M.REQUIREMENT_输入时)('01'、'04'、'KE')然后是M.QUANTITY ELSE 0 END)、0)/SUM(当M.REQUIREMENT_TYPE='PB'然后是M.QUANTITY ELSE 0 END时的情况)作为[订单总额/总额],---需要反向计算,这适用于FCST高于SUM_ORDERS/SUM_FCST的情况-但当后一列中有一个值时,我仍然得到0-有没有办法得到负数或显示后一列中的值比比较列中的值多?如果有帮助,我想我知道我缺少了什么,但不确定-我需要一个计算-即使它是0/0,我只需要它是0-当我检查AC5234时,它在第7个月有一个数量,在SUM\u FCST列中有255个,但在SUM\u ORDERS列中是0-对于如何让它工作有点困惑只需将SUM\u ORDERS转换为decimal并使用ISNULL。第一个结果是正确的计算-我需要它反转ed虽然-即01,04.ke/pb-但当我这样做时,我在关键字ASNULLIF(SUM(当M.REQUIREMENT_输入('01','04','ke')然后M.QUANTITY ELSE 0 END)上得到一个错误,0)/SUM(当M.REQUIREMENT_TYPE='pb'然后M.QUANTITY ELSE 0 END)作为[SUM_ORDERS/SUM\FCST],---需要反向计算