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_ID
和 DISTINCT(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;
我有以下表格;格式: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_ID
和 DISTINCT(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;