Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL(Teradata):删除GroupBy/CASE语句导致的空值_Sql_Group By_Null_Case_Teradata - Fatal编程技术网

SQL(Teradata):删除GroupBy/CASE语句导致的空值

SQL(Teradata):删除GroupBy/CASE语句导致的空值,sql,group-by,null,case,teradata,Sql,Group By,Null,Case,Teradata,我的结果中出现空值的问题。这是因为我如何使用groupby&CASE语句和“ItemDamagedStatus”。一种解决方案可能是将这些CASE语句项拆分出来,并连接到同一个表。然而,当我这样做时,一些数据被删除了 下面的查询实际上给了我正确的数字。我只想把它汇总成一行,基于:产品/市场/组1 想法?有问题吗 SELECT t1.Product , t1.Market , t1.Group1

我的结果中出现空值的问题。这是因为我如何使用groupby&CASE语句和“ItemDamagedStatus”。一种解决方案可能是将这些CASE语句项拆分出来,并连接到同一个表。然而,当我这样做时,一些数据被删除了

下面的查询实际上给了我正确的数字。我只想把它汇总成一行,基于:产品/市场/组1

想法?有问题吗

SELECT   t1.Product
        , t1.Market 
        , t1.Group1                                            
        , COUNT(DISTINCT t1.ItemID ||'-'||t1.Date1) AS StoredMth
        , CASE WHEN t1.ItemDamagedStatus = 'C' THEN COUNT(DISTINCT t1.ItemID ||'-'|| t1.Date1) END AS CompleteDmgMth
        , CASE WHEN t1.ItemDamagedStatus = 'P' THEN COUNT(DISTINCT t1.ItemID ||'-'|| t1.Date1) END AS PartialDmgMth
        , CASE WHEN t1.ItemDamagedStatus = 'N' THEN COUNT(DISTINCT t1.ItemID ||'-'|| t1.Date1) END AS NotDmgMth
        , CASE WHEN t1.ItemRepairStatus = 'Y' THEN COUNT(DISTINCT t1.ItemID ||'-'|| t1.Date1) END AS RepairMth
FROM  MainDatabase.Items t1
WHERE  t1.Date1 BETWEEN '2017-01-01' AND '2017-12-31'
GROUP BY      t1.Product
            , t1.Market 
            , t1.Group1  
            , t1.ItemDamagedStatus
            , t1.ItemRepairStatus
我得到的结果是:

Product Market Group1 StoredMth CompleteDmgMth PartialDmgMth NotDmgMth  RepairMth
Car     North  Y      950       50             NULL          NULL       75
Car     North  Y      NULL      NULL           100           NULL       NULL
Car     North  Y      NULL      NULL           NULL          800        NULL
Car     North  N      165       NULL           75            NULL       10
Car     North  N      NULL      NULL           NULL          90         NULL
Car     South  Y      1400      500            NULL          NULL       800
Car     South  Y      NULL      NULL           NULL          900        NULL
我想要的结果是:

Product Market Group1 StoredMth CompleteDmgMth PartialDmgMth NotDmgMth  RepairMth
Car     North  Y      950       50             100           800        75
Car     North  N      165       NULL           75            90         10
Car     South  Y      1400      500            NULL          900        800
(这只是一个后续步骤,以防有人对此不屑一顾,或者他们试图合并某些值……是的:CompleteDmgMth+PartialMgmth+NotDmgMth=StoredMath,但在我们的数据中,它并非总是超精确的,所以我们使用两种不同的方法。)


很抱歉,如果某些内容看起来很奇怪或框架不正确,这是我第一次在这里发布。

您可以使用MAX仅捕获非空值,而不是对这些字段进行分组:

SELECT derived_table.Product,
derived_table.Market
, derived_table.Group1
, MAX(derived_table.StoredMth) as StoredMth
, MAX(derived_table.CompleteDmgMth) as CompleteDmgMth
, MAX(derived_table.PartialDmgMth) as PartialDmgMth
, MAX(derived_table.NotDmgMth) as NotDmgMth
, MAX(derived_table.RepairMth) as RepairMth
FROM (

SELECT   t1.Product
        , t1.Market 
        , t1.Group1                                            
        , COUNT(DISTINCT t1.ItemID ||'-'||t1.Date1) AS StoredMth
        , CASE WHEN t1.ItemDamagedStatus = 'C' THEN COUNT(DISTINCT t1.ItemID ||'-'|| t1.Date1) END AS CompleteDmgMth
        , CASE WHEN t1.ItemDamagedStatus = 'P' THEN COUNT(DISTINCT t1.ItemID ||'-'|| t1.Date1) END AS PartialDmgMth
        , CASE WHEN t1.ItemDamagedStatus = 'N' THEN COUNT(DISTINCT t1.ItemID ||'-'|| t1.Date1) END AS NotDmgMth
        , CASE WHEN t1.ItemRepairStatus = 'Y' THEN COUNT(DISTINCT t1.ItemID ||'-'|| t1.Date1) END AS RepairMth
FROM  MainDatabase.Items t1
WHERE  t1.Date1 BETWEEN '2017-01-01' AND '2017-12-31'
GROUP BY      t1.Product
            , t1.Market 
            , t1.Group1  
            , t1.ItemDamagedStatus
            , t1.ItemRepairStatus) as derived_table
GROUP BY derived_table.Product,
derived_table.Market
, derived_table.Group1;

使用聚合,但不是对所有列使用聚合。您可以将
大小写
表达式嵌套在
计数(不同)
中:


太快了,格雷格,谢谢!它基本上是有效的,但我知道如何解决确实出现的问题。(StoredMath的最大值是问题所在,如果group by包含ItemDamagedStatus/ItemRepairStatus,则它不应该是最大值——有很多方法可以修复它,但一种快速方法是专门针对StoredMath的另一个派生表。)太好了!谢谢你,戈登,按我的需要工作!完全忘记了可以在聚合函数中嵌套案例,哈哈。
SELECT t1.Product, t1.Market, t1.Group1,                                        
        COUNT(DISTINCT t1.ItemID || '-' || t1.Date1) AS StoredMth
        COUNT(DISTINCT CASE WHEN t1.ItemDamagedStatus = 'C' THEN t1.ItemID || '' || t1.Date1) END) AS CompleteDmgMth
        COUNT(DISTINCT CASE WHEN t1.ItemDamagedStatus = 'P' THEN t1.ItemID || '' || t1.Date1 END) AS PartialDmgMth
        COUNT(DISTINCT CASE WHEN t1.ItemDamagedStatus = 'N' THEN t1.ItemID || '-' || t1.Date1 END) AS NotDmgMth
        COUNT(DISTINCT CASE WHEN t1.ItemRepairStatus = 'Y' THEN t1.ItemID || '-' || t1.Date1 END) AS RepairMth
FROM  MainDatabase.Items t1
WHERE  t1.Date1 BETWEEN '2017-01-01' AND '2017-12-31'
GROUP BY t1.Product, t1.Market, t1.Group1;