【问题标题】:Group by & Union In SqlSql中的分组和联合
【发布时间】:2014-09-25 07:04:04
【问题描述】:

我对这个 GROUP BY & Union 语句感到非常困惑。

现在我正在收到这个 O/P。

但我希望我的输出如下所示:

   Vendor Name          Purchase Order         Req Qty        Inward Qty
   ----------------------------------------------------------------------       
   Philips Lighting      PO20140918133011        350             350
   (I) Pvt Ltd

要求:

如果我的供应商为空,那么我还必须根据采购订单进行分组。 但是我得到的输出没有满足所有要求有没有什么方法可以仅根据采购订单进行分组。

**查询:**

SELECT
    vendor_name,
    purchase_order_no,  
    SUM(ISNULL(InwardQty,0)) AS InwardQty,
    SUM(ISNULL(ReqQty,0)) ReqQty
FROM
(
    SELECT 
        vendor_name,
        pm.purchase_order_no,
        ISNULL(SUM(PIIM.qty),0) AS ReqQty,
        0 InwardQty
    FROM  
        RS_Purchase_Order_Master AS PM
        LEFT OUTER JOIN RS_Purchase_Invoice_Info_Master AS PIIM ON PIIM.purchase_order_no = PM.purchase_order_no
        LEFT OUTER JOIN RS_Vendor_Master AS VM ON VM.vendor_id = PM.vendor_id
    WHERE 
        IsPicreated = 1
    GROUP BY 
        vendor_name,
        pm.purchase_order_no

    UNION

    SELECT
        NULL AS vendor_name,
        purchase_order_no,
        0 AS ReqQty,
        ISNULL(SUM(qty),0) AS InwardQty
    FROM
        RS_GIN_Master       
    GROUP BY
        purchase_order_no
)
AS A
GROUP BY
    vendor_name,
    purchase_order_no

任何帮助或建议将不胜感激。

提前谢谢你

【问题讨论】:

  • 你应该反转你的ISNULL(SUM(。如果一个值为 null,而其他值为 null,则 sum 将返回 null,您的整个值为 0。SUM(ISNULL(InwardQTY, 0))
  • 感谢 paqogomez 先生的建议。但我的主要问题是我得到两行,因为供应商列中的空值我应该如何将两行转换为一行。
  • 这就是为什么它是一个评论,而不是一个答案,但是这将是你的结果中的一个问题。您的主要问题是因为您按供应商名称分组。一个 vendor_name 是 phillips,另一个是 null(null 仍然是一个值,如果有意义的话,它与 phillips 不同)。您应该删除 vendor_name,仅按 PO 分组,然后重新加入以获取供应商名称。

标签: sql sql-server group-by sql-server-2012 union-all


【解决方案1】:

您不需要创建临时表。只需从 GROUP BY 中删除 vendor_name,然后添加 MAX(vendor_name)。

SELECT
    MAX(vendor_name) AS vendor_name,
    purchase_order_no,  
    SUM(ISNULL(InwardQty,0)) AS InwardQty,
    SUM(ISNULL(ReqQty,0)) AS ReqQty
FROM
(
    SELECT 
        vendor_name,
        pm.purchase_order_no,
        ISNULL(SUM(PIIM.qty),0) AS ReqQty,
        0 InwardQty
    FROM  
       RS_Purchase_Order_Master AS PM
       LEFT OUTER JOIN RS_Purchase_Invoice_Info_Master AS PIIM ON PIIM.purchase_order_no = PM.purchase_order_no
       LEFT OUTER JOIN RS_Vendor_Master AS VM ON VM.vendor_id = PM.vendor_id
    WHERE 
        IsPicreated = 1
    GROUP BY 
        vendor_name,
        pm.purchase_order_no

    UNION

    SELECT
        NULL AS vendor_name,
        purchase_order_no,
        0 AS ReqQty,
        ISNULL(SUM(qty),0) AS InwardQty
    FROM
        RS_GIN_Master       
    GROUP BY
        purchase_order_no
)
AS A
GROUP BY
    purchase_order_no

【讨论】:

    【解决方案2】:

    我不知道这是否是最好的解决方案,但我会创建一个临时表 (@a):

    declare @a table (
    purchase_order_no varchar(100),
    TotalReqQty int,
    TotalInwardQty int )
    

    插入结果:

    SELECT  purchase_order_no, 
       SUM(ReqQty), 
       SUM(InwardQty)
    FROM table 
    group by purchase_order_no
    

    然后我会使用内部连接来让供应商使用这样的东西:

    SELECT T.Vendor_Name,
       A.purchase_order_no, 
       A.TotalReqQty,
       A.TotalInwardQty
    FROM @a a
    inner join 
    ( SELECT DISTINCT Vendor_Name, purchase_order_no
      FROM table WHERE Vendor_Name IS NOT NULL ) T
        ON A.purchase_order_no = T.purchase_order_no
    

    【讨论】:

      【解决方案3】:

      如果我查看您的查询:

      Union in sub Query --> 得到每个 purchase_order_no 表 RS_GIN_Master 中的 sum(qty)

      Sub Query --> 将 2 行设为单行。

      试试这个:

      SELECT 
          vendor_name,
          pm.purchase_order_no,
          ISNULL(SUM(PIIM.qty),0) AS ReqQty,
          sum(xx.InwardQty) as InwardQty
      FROM  
          RS_Purchase_Order_Master AS PM
          LEFT OUTER JOIN RS_Purchase_Invoice_Info_Master AS PIIM ON PIIM.purchase_order_no =      PM.purchase_order_no
          LEFT OUTER JOIN RS_Vendor_Master AS VM ON VM.vendor_id = PM.vendor_id
          LEFT JOIN (
                      SELECT purchase_order_no, ISNULL(SUM(qty),0) AS InwardQty
                      FROM RS_GIN_Master  
                      GROUP BY purchase_order_no
                  ) xx On xx.purchase_order_no = pm.purchase_order_no
      WHERE 
          IsPicreated = 1
      GROUP BY 
          vendor_name,
          pm.purchase_order_no
      

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多