ORACLE SQL select distinct 不删除重复项

ORACLE SQL select distinct not removing duplicates

我有以下表格;格式:table_name[column1, column2, etc..]

VENDOR_ORDERS [ORDER_ID, ORDER_CREATION_DATETIME, REGION_ID, ZIP_CODE, AMOUNT]
CALENDAR [CALENDAR_WEEK, CALENDAR_DATE]

基本上我想要实现的是编写一个查询,它将给我:

每个 CALENDAR_WEEK COUNT(ORDER_ID)SUM(AMOUNT) 每个 REGION_IDDISTINCT(ZIP_CODE)

所以结果应该是这样的:

ZIP_CODE    CALENDAR_WEEK    REGION_ID    COUNT(ORDER_ID)    SUM(AMOUNT)
                            --------------------
XXXXX           01              1             50               987.45
YYYYY           01              1             25               568.32
ZZZZZ           01              1             30               555.63
MMMMM           01              1             10               099.93
XXXXX           15              1             05               999.34
YYYYY           15              1             32               339.67
ZZZZZ           15              1             21               457.23
MMMMM           15              1             88               459.99

我使用了以下代码:

SELECT
    DISTINCT(vo.ZIP_CODE)
    ,TO_CHAR(ca.CALENDAR_WEEK)
    ,TRUNC(vo.ORDER_CREATION_DATETIME) -- this column is not needed, i just added it for visualization purposes
    ,vo.REGION_ID
    ,COUNT(vo.ORDER_ID)
    ,SUM(vo.AMOUNT)
FROM
    VENDOR_ORDERS vo
    ,CALENDAR ca
WHERE   
    TRUNC(vo.ORDER_CREATION_DATETIME) = sd.CALENDAR_DATE
    AND vo.REGION_ID = 1
GROUP BY
    vo.ZIP_CODE
    ,TO_CHAR(ca.CALENDAR_WEEK)
    ,vo.ORDER_CREATION_DATETIME
    ,vc.REGION_ID;

问题是我没有得到 DISTINCT(ZIP_CODE) 每个 CALENDAR_WEEK,我重复 ZIP_CODE 相同的 CALENDAR_WEEK,相同的 REGION_ID 但不同 COUNT(ORDER_ID)SUM(AMOUNT)

我希望我说清楚了。 提前感谢您的帮助

你误解了distinct是什么。它不是一个函数。它是 select 上的修饰符,它会影响 所有 列被选中。所以,它的行为完全符合预期。

如果您希望按邮政编码和周进行汇总,那么 group by:

中应该只有这两列
SELECT vo.ZIP_CODE, TO_CHAR(ca.CALENDAR_WEEK),
       -- vo.REGION_ID
        COUNT(vo.ORDER_ID),
        SUM(vo.AMOUNT)
FROM VENDOR_ORDERS vo JOIN
     CALENDAR ca
     ON TRUNC(vo.ORDER_CREATION_DATETIME) = sd.CALENDAR_DATE
WHERE vo.REGION_ID = 1
GROUP BY vo.ZIP_CODE, TO_CHAR(ca.CALENDAR_WEEK)

您也可以包括 region_id,假设每个邮政编码都在一个地区。

您的 DISTINCT 在此查询中没有任何用途,它将应用于所有列,而不是您认为的仅应用于 ORDER_ID。想一想:如果您有多个 ORDER_ID 对所有其他列具有不同的值,那么 Oracle 如何知道要 return 的哪个 ??

此外,指定 DISTINCT 是没有用的,因为您正在执行最终达到相同结果的 GROUP BY。

最后但同样重要的是,你在评论中这样说是错误的:

-- this column is not needed, i just added it for visualization

您的 SELECT 中需要它,因为它是 GROUP BY

的基本字段

没有 seing 数据样本我不能说 100%,但你的问题可能是因为在你的 select 你在你的日期时间字段上做了一个 TRUNC,而不是在你的 GROUP BY条款。所以它 return 不是你想要的,你不明白为什么因为你的 select 显示了一个截断的日期,你认为 GROUP BY 也在日期上工作,但事实并非如此,它按 DATE 和 TIME

分组

要了解您的问题,请执行以下操作:

SELECT
    DISTINCT(vo.ZIP_CODE)
    ,TO_CHAR(ca.CALENDAR_WEEK)
    ,vo.ORDER_CREATION_DATETIME 
    ,vo.REGION_ID
    ,COUNT(vo.ORDER_ID)
    ,SUM(vo.AMOUNT)
FROM
    VENDOR_ORDERS vo
    ,CALENDAR ca
WHERE   
    TRUNC(vo.ORDER_CREATION_DATETIME) = sd.CALENDAR_DATE
    AND vo.REGION_ID = 1
GROUP BY
    vo.ZIP_CODE
    ,TO_CHAR(ca.CALENDAR_WEEK)
    ,vo.ORDER_CREATION_DATETIME
    ,vc.REGION_ID;

要解决您的问题,请执行以下操作:

SELECT
    DISTINCT(vo.ZIP_CODE)
    ,TO_CHAR(ca.CALENDAR_WEEK)
    ,TRUNC(vo.ORDER_CREATION_DATETIME) 
    ,vo.REGION_ID
    ,COUNT(vo.ORDER_ID)
    ,SUM(vo.AMOUNT)
FROM
    VENDOR_ORDERS vo
    ,CALENDAR ca
WHERE   
    TRUNC(vo.ORDER_CREATION_DATETIME) = sd.CALENDAR_DATE
    AND vo.REGION_ID = 1
GROUP BY
    vo.ZIP_CODE
    ,TO_CHAR(ca.CALENDAR_WEEK)
    ,TRUNC(vo.ORDER_CREATION_DATETIME)
    ,vc.REGION_ID;