2017-10-05 48 views
-2

我只需要输出Cnt < 6个值......我可以在没有将它们插入新表的情况下获取它们。如何在函数中使用新声明的列?

SQL查询

(SELECT t3.State_Name, 
      t2.Customer_Name, 
      sum(t1.Qty) AS qty,(CASE 
            WHEN (row_number()OVER (PARTITION BY t3.state_name 
                  ORDER BY t3.state_name DESC)<6) 
           END)'Cnt' 
    FROM t1 
    JOIN T2 ON (t1.customer_code=t2.customer_code) 
    JOIN t3 ON (t3.Area_code=t1.Area_code) 
    WHERE Cnt<6 
    GROUP BY State_Name, 
      Customer_Name) 

回答

2

有很多例子,在这里描述了如何使用row_number()检索组中的第n行的答案。

通过...WHERE Cnt < 6可以帮助您了解您正在尝试实现的目标。

如果您似乎试图检索每个国家的前六个条目,那么您希望将您的查询置于子选择中,因为row_number()结果无法在WHERE子句中访问相同的查询;做这样的事情......

SELECT t.State_Name, 
     t.Customer_Name, 
     t.qty 
FROM 
(
    SELECT t3.State_Name, 
      t2.Customer_Name, 
      sum(t1.Qty) AS qty, 
      row_number() OVER (PARTITION BY t3.state_name ORDER BY t3.state_name DESC) AS Cnt 
    FROM t1 
    INNER JOIN T2 ON t1.customer_code = t2.customer_code 
    INNER JOIN t3 ON t3.Area_code = t1.Area_code 
    GROUP BY State_Name,Customer_Name 
) t 
WHERE Cnt < 6 

但是,这不会给你最高量的六国也不会给你在每个国家的最高量的六个客户。在任何一种情况下,按照与分区列相同的列进行排序会给您带来非确定性结果;您将需要更改row_number()函数上的ORDER BY以使用sum(qty)

对于后者只是改变ORDER BY ...

SELECT t.State_Name, 
     t.Customer_Name, 
     t.qty 
FROM 
(
    SELECT t3.State_Name, 
      t2.Customer_Name, 
      sum(t1.Qty) AS qty, 
      row_number() OVER (PARTITION BY t3.state_name ORDER BY sum(t1.Qty) DESC) AS Cnt 
    FROM t1 
    INNER JOIN T2 ON t1.customer_code = t2.customer_code 
    INNER JOIN t3 ON t3.Area_code = t1.Area_code 
    GROUP BY State_Name,Customer_Name 
) t 
WHERE Cnt < 6 

对于前者,你也将需要删除PARTITION BY ...

SELECT t.State_Name, 
     t.Customer_Name, 
     t.qty 
FROM 
(
    SELECT t3.State_Name, 
      t2.Customer_Name, 
      sum(t1.Qty) AS qty, 
      row_number() OVER (ORDER BY sum(t1.Qty) DESC) AS Cnt 
    FROM t1 
    INNER JOIN T2 ON t1.customer_code = t2.customer_code 
    INNER JOIN t3 ON t3.Area_code = t1.Area_code 
    GROUP BY State_Name,Customer_Name 
) t 
WHERE Cnt < 6 
+0

谢谢你,帮我 – Sasank

相关问题