我在Google Big Query中使用了一个简单的命令来按商品和按月份显示按商店显示的销量,但是由于某些商品未被购买,因此省略了月份。因此,我想知道所有月份都在编码。 enter image description here
现在,我尝试通过构建时间索引和item_code并与商店交叉连接来解决问题,但是如果我将其与所有项目代码一起应用,则必须是大量行。
SELECT bp_no,sales_month,sales_year,sum(report_qty) AS volume
FROM my_table
WHERE sales_year between 2016 and 2017 and bp_no is not null and report_qty is not null
GROUP BY bp_no,sales_month,sales_year
ORDER BY bp_no,sales_year, sales_month
答案 0 :(得分:1)
您可以使用WITH
语句创建一个临时映射表,该语句将保存year
,month
,store
和item
的元数据。它会稍作引导,但应返回您的预期结果。
查询
WITH META AS (
SELECT DISTINCT
YEAR,
MONTH,
STORE,
ITEM,
FROM
`project.dataset.your_table`,
UNNEST(GENERATE_ARRAY(1,12)) AS MONTH,
UNNEST(GENERATE_ARRAY(2016,2017) AS YEAR
ORDER BY 1,2
)
SELECT
META.YEAR,
META.MONTH,
META.STORE,
META.ITEM,
SUM(DATA.QUANTITY)
FROM
META
LEFT JOIN `project.dataset.your_table` AS DATA ON META.MONTH = DATA.MONTH
AND META.YEAR = DATA.YEAR
AND META.ITEM = DATA.ITEM
AND META.STORE = DATA.STORE
GROUP BY
1,2,3,4
如果要查看其他时间跨度,显然可以在年份的GENERATE_ARRAY
函数中修改上限和下限。
它还假设您的月份的格式为1,2,3,...,12,并且YEAR
和MONTH
的类型均为int64
。如果没有,您将不得不CAST
将这些文件提交到INT64
。
输出
其他信息
GENERATE_ARRAY
的更多信息UNNEST
的更多信息答案 1 :(得分:1)
以下是用于BigQuery标准SQL
#standardSQL
SELECT
bp_no,
sales_month,
sales_year,
SUM(IFNULL(report_qty, 0)) AS volume
FROM (SELECT DISTINCT bp_no FROM `project.dataset.my_table`),
UNNEST(GENERATE_ARRAY(1, 12)) sales_month,
UNNEST(GENERATE_ARRAY(2016, 2017)) sales_year
LEFT JOIN `project.dataset.my_table`
USING(bp_no, sales_month, sales_year)
GROUP BY bp_no, sales_month, sales_year