【问题标题】:SQL query to duplicate each row 12 timesSQL 查询将每行复制 12 次
【发布时间】:2018-01-03 16:46:52
【问题描述】:

我有一张表,其中包含 site、year 和 sales 列。此表在站点+年份中是唯一的,例如

site  year   sales
-------------------
a     2012    50
b     2013   100
a     2006    35

现在我想做的是让这张表在网站+年+月上独一无二。因此,每一行被重复 12 次,添加了一个月列,标记为 1-12,销售值除以 12

site   year  month  sales
-------------------------
a      2012  1      50/12
a      2012  2      50/12
...
a      2012  12     50/12
...

b      2013   1     100/12 
...
a      2006   12       35/12

我目前正在 python 上执行此操作,它的工作原理很吸引人,但我需要在 SQL 中执行此操作(最好是 PostgreSQL,因为我将使用它作为 tableau 的数据源)

如果有人也可以提供解决方案的解释,那将非常有帮助,因为我是这方面的新手

【问题讨论】:

  • 你有没有尝试过?

标签: sql postgresql


【解决方案1】:

您可以为此使用generate_series()

select t.site, t.year, g.month, t.sales / 12
from the_table t
  cross join generate_series(1,12) as g (month)
order by  t.site, t.year, g.month;

如果sales 列是整数,则应将其转换为numeric 以避免整数除法:t.sales::numeric / 12

在线示例:http://rextester.com/GUWPI39685

【讨论】:

  • 谢谢!非常简短而优雅的解决方案
【解决方案2】:

试试这个方法(对于 T-SQL - MS SQL):

DECLARE @T TABLE
(
    [site] VARCHAR(5),  
    [year] INT,   
    sales INT
)

INSERT INTO @T
VALUES('A',2012,50),('B',2013,100),('C',2006,35)

;WITH CTE
AS
(
    SELECT
        MonthSeq = 1

    UNION ALL

    SELECT
        MonthSeq = MonthSeq+1
        FROM CTE
            WHERE MonthSeq <12  
)
SELECT
    T.[site],
    T.[year],
    [Month] = CTE.MonthSeq,
    sales = T.[sales]/12
    FROM CTE
        CROSS JOIN @T T
            ORDER BY T.[site],CTe.MonthSeq

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多