簡體   English   中英

多個列中DISTINCT個值中的COUNT個

[英]COUNT from DISTINCT values in multiple columns

抱歉,如果您以前曾提出過此問題,請在分解和發布之前找不到類似的問題/解決方案。 我有以下查詢(使用Oracle SQL)在某種意義上可以正常工作,但不能完全滿足我的要求。

SELECT
    order_date,
    p_category,
    CASE
        WHEN ( issue_grp = 1 ) THEN '1'
        ELSE '2/3 '
    END AS issue_group,
    srt   AS srt_level,
    COUNT(*) AS total_orders
FROM
    database.t_con
WHERE
    order_date IN (
        '&Enter_Date_YYYYMM'
    )
GROUP BY
    p_category,
    CASE
        WHEN ( issue_grp = 1 ) THEN '1'
        ELSE '2/3 '
    END,
    srt,
    order_date
ORDER BY
    p_category,
    issue_group,
    srt_level,
    order_date

當前返回(12行):

在此處輸入圖片說明

所需的回報(8行,未顯示棕褐色的行):

在此處輸入圖片說明

這是我期望的total_order列的邏輯:

  • order_date的計數,其中(srt_level = 80 + 100 + Late)...'Late'計數需要添加到總數中,只是不顯示

我最終要添加一個filled_orders列,該列將位於total_orders列之前,但我還沒有。

抱歉,我之前沒有這么描述。 再次感謝!

您似乎不需要子查詢; 如果您想要每個值組合的計數,則將其分組,並在該級別進行匯總; 就像是:

SELECT
    t1.order_date,
    t1.p_category,
    CASE
        WHEN ( t1.issue_grp = 1 ) THEN '1'
        ELSE '2/3 '
    END AS issue_group,
    t1.srt AS srt_level,
    COUNT(*) AS total_orders
FROM
    database.t_con t1
WHERE
    t1.order_date = TO_DATE ( '&Enter_Date_YYYYMM', 'YYYYMM' )
GROUP BY
    t1.p_category,
    CASE
        WHEN ( t1.issue_grp = 1 ) THEN '1'
        ELSE '2/3 '
    END,
    t1.srt,
    t1.order_date
ORDER BY
    p_category,
    issue_group,
    srt_level,
    order_date;

您不應該依賴於date參數的隱式轉換和NLS設置(假設order_date實際上是日期列,而不是字符串),所以我使用了顯式的TO_DATE()調用,使用了替換變量建議的格式名稱和提示。

但是,這將為您提供所提供月份的第一天,因為沒有提供日期編號。 您更有可能想要提示一個完整的日期,或者(可能)僅提示年/月,但想要包括該月的所有天數-如果您打算這樣做,則IN()不會這樣做。 這也意味着存儲的日期都將其時間部分設置為午夜,因為這將與之匹配。 如果這些值具有非午夜時間,那么您也需要一個范圍來選擇這些值。

在我的問題范圍內,我得到了它的解決。 只需要嵌套發生計數/計算的每一列。

SELECT
    order_date,
    p_category,
    issue_group,
    srt_level,
    order_count,
    SUM(order_count) OVER(
        PARTITION BY order_date, issue_group, p_category
    ) AS total_orders
FROM
    (
        SELECT
            order_date,
            p_category,
            CASE
                WHEN ( issue_grp = 1 ) THEN '1'
                ELSE '2/3 '
            END AS issue_group,
            srt   AS srt_level,
            COUNT(*) AS order_count
        FROM
            database.t_con
        WHERE
            order_date IN (
                '&Enter_Date_YYYYMM'
            )
        GROUP BY
            p_category,
            CASE
                WHEN ( issue_grp = 1 ) THEN '1'
                ELSE '2/3 '
            END,
            srt,
            order_date
    )
ORDER BY
    order_date,
    p_category,
    issue_group

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM