Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询将每行复制12次_Sql_Postgresql - Fatal编程技术网

SQL查询将每行复制12次

SQL查询将每行复制12次,sql,postgresql,Sql,Postgresql,我有一个表,其中列网站,年和销售。此表在现场+年份中是唯一的,例如 site year sales ------------------- a 2012 50 b 2013 100 a 2006 35 现在我想做的是使这个表在站点+年+月上唯一。因此,每行重复12次,添加一个月列,该列标记为1-12,销售值除以12 site year month sales ------------------------- a 2012 1

我有一个表,其中列网站,年和销售。此表在现场+年份中是唯一的,例如

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的数据源

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

您可以使用generate_series

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


在线示例:

尝试使用这种方法处理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

你试过什么吗?谢谢!非常简短和优雅的解决方案
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