【问题标题】:TSQL - selecting data for a record when it does not existTSQL - 为不存在的记录选择数据
【发布时间】:2011-07-15 15:39:25
【问题描述】:

我无法弄清楚这是我的表结构:

Table period(yearMonth varchar(6), weekOfMonth varchar(1), fullDate date)

Table data(SKU varchar(6), received int, yearMonth varchar(6), fullDate date)

这是我这段时期的数据:

yearMonth weekOfMonth fullDate
------------------------------------------
201104     1     Apr  3 2011 12:00AM
201104     1     Apr  4 2011 12:00AM
201104     1     Apr  5 2011 12:00AM
201104     1     Apr  6 2011 12:00AM
201104     1     Apr  7 2011 12:00AM
201104     1     Apr  8 2011 12:00AM
201104     1     Apr  9 2011 12:00AM
201104     2     Apr 10 2011 12:00AM
201104     2     Apr 11 2011 12:00AM
201104     2     Apr 12 2011 12:00AM
201104     2     Apr 13 2011 12:00AM
201104     2     Apr 14 2011 12:00AM
201104     2     Apr 15 2011 12:00AM
201104     2     Apr 16 2011 12:00AM
201104     3     Apr 17 2011 12:00AM
201104     3     Apr 18 2011 12:00AM
201104     3     Apr 19 2011 12:00AM
201104     3     Apr 20 2011 12:00AM
201104     3     Apr 21 2011 12:00AM
201104     3     Apr 22 2011 12:00AM
201104     3     Apr 23 2011 12:00AM
201104     4     Apr 24 2011 12:00AM
201104     4     Apr 25 2011 12:00AM
201104     4     Apr 26 2011 12:00AM
201104     4     Apr 27 2011 12:00AM
201104     4     Apr 28 2011 12:00AM
201104     4     Apr 29 2011 12:00AM
201104     4     Apr 30 2011 12:00AM
201105     1     May  1 2011 12:00AM
201105     1     May  2 2011 12:00AM
201105     1     May  3 2011 12:00AM
201105     1     May  4 2011 12:00AM
201105     1     May  5 2011 12:00AM
201105     1     May  6 2011 12:00AM
201105     1     May  7 2011 12:00AM
201105     2     May  8 2011 12:00AM
201105     2     May  9 2011 12:00AM
201105     2     May 10 2011 12:00AM
201105     2     May 11 2011 12:00AM
201105     2     May 12 2011 12:00AM
201105     2     May 13 2011 12:00AM
201105     2     May 14 2011 12:00AM
201105     3     May 15 2011 12:00AM
201105     3     May 16 2011 12:00AM
201105     3     May 17 2011 12:00AM
201105     3     May 18 2011 12:00AM
201105     3     May 19 2011 12:00AM
201105     3     May 20 2011 12:00AM
201105     3     May 21 2011 12:00AM
201105     4     May 22 2011 12:00AM
201105     4     May 23 2011 12:00AM
201105     4     May 24 2011 12:00AM
201105     4     May 25 2011 12:00AM
201105     4     May 26 2011 12:00AM
201105     4     May 27 2011 12:00AM
201105     4     May 28 2011 12:00AM
201106     1     Jun  1 2011 12:00AM
201106     1     Jun  2 2011 12:00AM
201106     1     Jun  3 2011 12:00AM
201106     1     Jun  4 2011 12:00AM
201106     1     May 29 2011 12:00AM
201106     1     May 30 2011 12:00AM
201106     1     May 31 2011 12:00AM
201106     2     Jun  5 2011 12:00AM
201106     2     Jun  6 2011 12:00AM
201106     2     Jun  7 2011 12:00AM
201106     2     Jun  8 2011 12:00AM
201106     2     Jun  9 2011 12:00AM
201106     2     Jun 10 2011 12:00AM
201106     2     Jun 11 2011 12:00AM
201106     3     Jun 12 2011 12:00AM
201106     3     Jun 13 2011 12:00AM
201106     3     Jun 14 2011 12:00AM
201106     3     Jun 15 2011 12:00AM
201106     3     Jun 16 2011 12:00AM
201106     3     Jun 17 2011 12:00AM
201106     3     Jun 18 2011 12:00AM
201106     4     Jun 19 2011 12:00AM
201106     4     Jun 20 2011 12:00AM
201106     4     Jun 21 2011 12:00AM
201106     4     Jun 22 2011 12:00AM
201106     4     Jun 23 2011 12:00AM
201106     4     Jun 24 2011 12:00AM
201106     4     Jun 25 2011 12:00AM
201106     5     Jul  1 2011 12:00AM
201106     5     Jul  2 2011 12:00AM
201106     5     Jun 26 2011 12:00AM
201106     5     Jun 27 2011 12:00AM
201106     5     Jun 28 2011 12:00AM
201106     5     Jun 29 2011 12:00AM
201106     5     Jun 30 2011 12:00AM

这是我尝试过的查询:

SELECT DISTINCT a.SKU, SUM(a.received) AS Received
a.yearMonth , p.weekOfMonth
FROM data a
RIGHT OUTER JOIN period p
ON p.fullDate = a.fullDate
WHERE p.yearMonth >= '201104' AND p.yearMonth < '201107'
GROUP BY a.SKU, a.yearMonth , p.weekOfMonth

如果没有数据,它不会返回每年的月份和该月的星期。

这是表数据中的数据:

sku received yearMonth fullDate
---------------------------------------
AAAA  5      201106    Jun 23 2011 12:00AM
BBBB  1      201106    Jun 10 2011 12:00AM
BBBB  1      201106    Jun 15 2011 12:00AM

这是我加入 2 个表时的数据:

SKU   received yearMonth weekOfMonth
-------------------------------------
AAAA    5      201106       4
BBBB    1      201106       2
BBBB    1      201106       3

如果没有数据,我想显示 NULL 或 0 来表示收到,例如:

SKU   received yearMonth weekOfMonth
-------------------------------------
AAAA    0      201104       1
AAAA    0      201104       2
AAAA    0      201104       3
AAAA    0      201104       4
AAAA    0      201105       1
AAAA    0      201105       2
AAAA    0      201105       3
AAAA    0      201105       4
AAAA    0      201106       1
AAAA    0      201106       2
AAAA    0      201106       3
AAAA    5      201106       4
AAAA    0      201106       5

BBBB    0      201104       1
BBBB    0      201104       2
BBBB    0      201104       3
BBBB    0      201104       4
BBBB    0      201105       1
BBBB    0      201105       2
BBBB    0      201105       3
BBBB    0      201105       4
BBBB    0      201106       1
BBBB    1      201106       2
BBBB    1      201106       3
BBBB    0      201106       4
BBBB    0      201106       5

提前致谢。

【问题讨论】:

  • 那一年呢?什么数据类型是“月”?字符(2)?
  • 对不起,我刚刚更新了它。我必须更改列,因为它是为了工作。
  • 我很好奇为什么这被否决了...

标签: tsql join


【解决方案1】:

SUM() 函数正在消除 NULL 结果。执行消息:警告:空值已被聚合或其他 SET 操作消除。

更新:
这很丑陋,但它有效。可能需要调整,更有专业知识的人可能会对其进行批评。

更新:
我添加了一个 DISTINCT 并删除了子查询中的 GROUP BY。


SELECT DISTINCT
    subQ.SKU,
    (
        SELECT SUM(d.Received) AS NumReceived
        FROM data d
            JOIN period p ON d.FullDate = p.FullDate
        WHERE d.YearMonth = subQ.yearMonth
          AND d.SKU = subQ.SKU
          AND p.weekOfMonth = subQ.weekOfMonth
        ) AS Received,
    subQ.yearMonth,
    subQ.weekOfMonth
FROM (
        SELECT DISTINCT
            d.SKU,
            p.yearMonth,
            p.weekOfMonth
        FROM
            period p,
            data d
      ) subQ
ORDER BY
    subQ.SKU

【讨论】:

  • 就是这样。非常感谢。
【解决方案2】:

如果这没有返回结果,那么您的周期表中肯定缺少记录:

SELECT DISTINCT 
    a.SKU, 
    SUM(a.received) AS Received
    a.month, 
    p.weekOfMonth
FROM 
    period p LEFT OUTER JOIN
    data a ON a.fullDate = p.fullDate
WHERE
    p.month >= '04' AND p.month < '07'
GROUP BY 
    a.SKU, 
    a.month, 
    p.weekOfMonth

【讨论】:

  • 我得到了相同的结果。周期表包含所有数据。我只是不明白为什么它不起作用。
  • 在这种情况下会返回什么?没有记录,有一些记录?
  • 与上面那 3 条记录相同 AAAA BBBBB 我更新了我的问题。我认为问题在于日期。每周有好几天。
猜你喜欢
  • 2016-02-17
  • 2017-11-06
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
相关资源
最近更新 更多