【问题标题】:How to get record count based on based on some conditions?如何根据某些条件获取记录数?
【发布时间】:2014-08-06 06:47:10
【问题描述】:

我需要准备一份报告,该报告将按月显示订单数量,其中收货地址 = 收单地址 和收货地址 收货地址的订单数量, 例如

年月Same_shipbill Diff_shipbill

2014 年 1 月 1768 1233

2014 年 2 月 1234 1222

当前年份等等。

我试过这个查询

SELECT  MAX(DATENAME(YEAR, order_date)) AS [YEAR],
        DATENAME(MONTH, order_date) AS [MONTH],
        COUNT(*) AS SAME_BILL_SHIP
FROM    x_master_order_tb O
         INNER JOIN tbl_Order_Addresses A
           ON A.addressID = O.addressid
WHERE   order_date BETWEEN '2014-01-01 00:00:00:000' AND GETDATE()
         AND wcs_status_id = 1
         AND A.ship_bill = 'Y'
GROUP BY    DATENAME(MONTH, order_date)

此查询仅获取其中 ship = bill address 的计数,不确定如何获取此查询中的“Diff_shipbill”列值? 我只需要翻转条件 A.ship_bill = 'N'

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    你的意思是你要像这样计算ship_bill Y 和 N?

    ;WITH cte AS
    (
     SELECT
       MAX(DATENAME(YEAR, order_date)) AS [YEAR]
      ,DATENAME(MONTH, order_date) AS [MONTH]
      ,MONTH(order_date) AS MONTHNR
      ,CASE WHEN A.ship_bill = 'Y' THEN COUNT(*) END AS SAME_BILL_SHIP
      ,CASE WHEN A.ship_bill = 'N' THEN COUNT(*) END AS DIFF_BILL_SHIP
     FROM x_master_order_tb O
      INNER JOIN tbl_Order_Addresses A
       ON A.addressID = O.addressid
     WHERE order_date BETWEEN '2014-01-01 00:00:00:000' AND GETDATE()
      AND wcs_status_id = 1
     GROUP BY
       DATENAME(MONTH, order_date)
      ,MONTH(order_date)
      ,A.ship_bill
    )
    SELECT
      YEAR
     ,MONTH
     ,MAX(SAME_BILL_SHIP) AS SAME_BILL_SHIP
     ,MAX(DIFF_BILL_SHIP) AS DIFF_BILL_SHIP
    FROM cte
    GROUP BY YEAR, MONTH, MONTHNR
    ORDER BY MONTHNR
    

    编辑:在GROUP BY 子句中添加了A.ship_bill。 编辑:使用 CTE 您可以松开 NULL 行

    【讨论】:

    • 错误:Column 'tbl_Order_Addresses.ship_bill' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
    • DIFF_BILL_SHIP 也总是计算为 NULL,这不是这种情况
    • 您的查询每个月生成两行,第一行为same_bill_ship 正确值,diff_bill_ship 为空,第二行相反。我们可以将这两个值放在一行中吗?
    • 你必须PIVOT 的值,或者你可以通过使用 CTE 和“分组 NULLS”绕过它
    • 您的查询现在可以工作了,我也使用 cte 编写了查询,但比您的要复杂一些。我们可以按月份对您的查询进行排序吗?
    【解决方案2】:

    您可以将 select 子句放在列列表中,这可以在同一行中为您提供 "same_bill_ship"、"diff_bill_ship"。 看看这是否有帮助。

    SELECT  MAX(DATENAME(YEAR, order_date)) AS [YEAR],
        DATENAME(MONTH, order_date) AS [MONTH],
        (SELECT COUNT(*) FROM FROM    x_master_order_tb O1 INNER JOIN tbl_Order_Addresses A1 ON A1.addressID = O1.addressid
            WHERE   order_date BETWEEN '2014-01-01 00:00:00:000' AND GETDATE() AND wcs_status_id = 1 AND A1.ship_bill = 'Y'
            GROUP BY    DATENAME(MONTH, order_date)),
        (SELECT COUNT(*) FROM FROM    x_master_order_tb O2 INNER JOIN tbl_Order_Addresses A2 ON A2.addressID = O2.addressid
            WHERE   order_date BETWEEN '2014-01-01 00:00:00:000' AND GETDATE() AND wcs_status_id = 1 AND A2.ship_bill = 'N'
            GROUP BY    DATENAME(MONTH, order_date))
    FROM    x_master_order_tb O
    INNER JOIN tbl_Order_Addresses A ON A.addressID = O.addressid
    WHERE   order_date BETWEEN '2014-01-01 00:00:00:000' AND GETDATE() AND wcs_status_id = 1
    GROUP BY    DATENAME(MONTH, order_date)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      相关资源
      最近更新 更多