Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 server 如何在SQLServer中使用CASE组合两个子查询_Sql Server_Select_Sum_Pivot_Cout - Fatal编程技术网

Sql server 如何在SQLServer中使用CASE组合两个子查询

Sql server 如何在SQLServer中使用CASE组合两个子查询,sql-server,select,sum,pivot,cout,Sql Server,Select,Sum,Pivot,Cout,我有两个子查询 SELECT SUM(QTY_BOUGHT * PRICE), SUM(QTY_BOUGHT), SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT) FROM TABLE_A WHERE DAYS_AGED >= 792 及 问题是我想用简单的case语句将它们组合起来,如下所示: SELECT CASE WHEN DAYS_AGED >= 792

我有两个子查询

SELECT 
    SUM(QTY_BOUGHT * PRICE), 
    SUM(QTY_BOUGHT), 
    SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
FROM 
    TABLE_A
WHERE 
    DAYS_AGED >= 792

问题是我想用简单的case语句将它们组合起来,如下所示:

SELECT
    CASE 
       WHEN DAYS_AGED >= 792 
          THEN SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
       WHEN DAYS_AGED < 792 
          THEN SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
    END
FROM 
    TABLE_A
我得到这个错误:

Msg 8120,16级,状态1,第127行 列“TABLE_A.DAYS_AGED”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

我可能想补充一点,我可以使用UNION或CTE组合它们,这很有效

SELECT 
    SUM(QTY_BOUGHT * PRICE), 
    SUM(QTY_BOUGHT), 
    SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
FROM 
    TABLE_A
WHERE 
    DAYS_AGED >= 792
UNION
SELECT 
    SUM(QTY_BOUGHT * PRICE), 
    SUM(QTY_BOUGHT), 
    SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
FROM 
    TABLE_A
WHERE 
    DAYS_AGED < 792
是否有方法使用CASE语句来整理这两个子查询,是否有可能这样做

您需要将CASE表达式放入聚合函数中:

SELECT 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT*PRICE END) amount1, 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT END) qty_bought1, 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT * PRICE END) 
        / SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT END) avg1,
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT*PRICE END) amount2, 
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT END) qty_bought2, 
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT * PRICE END) 
        / SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT END) avg2
FROM TABLE_A

您可以在CTE的CASE语句中使用您的条件,然后在组中使用它,如下所示:


是否有可能使用IF.进行此操作。。否则,我只是好奇如果DAYS_AGED>=792选择SumQuantity_BOUGHTPRICE,SumQuantity_BuughtPrice,SumQuantity_BOUGHTPRICE/SumQuantity_BuughtPrice/SumQuantity_BuughtPrice从表A中购买这些行中的内容,是否可以完成……如果……ELSE是一个逻辑流操作符,@Sree,而不是一个函数。不能在SELECT语句中使用它。可以使用IIF而不是CASE。。。但在幕后,这仍然是一个案例表达。
SELECT 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT*PRICE END) amount1, 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT END) qty_bought1, 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT * PRICE END) 
        / SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT END) avg1,
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT*PRICE END) amount2, 
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT END) qty_bought2, 
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT * PRICE END) 
        / SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT END) avg2
FROM TABLE_A
WITH CTE AS
(
    SELECT CASE WHEN DAYS_AGED >= 792 THEN 1 ELSE 0 END AS DAYS_AGED_GREATER_OR_EQUAL_792,
            QTY_BOUGHT, PRICE
        FROM TABLE_A
)
SELECT DAYS_AGED_GREATER_OR_EQUAL_792, SUM(QTY_BOUGHT * PRICE), SUM(QTY_BOUGHT),
        SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
    FROM CTE
    GROUP BY DAYS_AGED_GREATER_OR_EQUAL_792;