Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 server 我怎样才能做到;“月”;Sql中的列?_Sql Server - Fatal编程技术网

Sql server 我怎样才能做到;“月”;Sql中的列?

Sql server 我怎样才能做到;“月”;Sql中的列?,sql-server,Sql Server,我有一组数据看起来像这样(非常简单): 在此基础上,我们尝试创建一个查询,以获得以下内容: productId Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec --------- ---- --- --- --- --- --- --- --- --- --- --- --- --- 1 2008 0 0 0 0 0 0 0 0 0 2 1 0 1

我有一组数据看起来像这样(非常简单):

在此基础上,我们尝试创建一个查询,以获得以下内容:

productId  Year  Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
---------  ----  --- --- --- --- --- --- --- --- --- --- --- ---
        1  2008    0   0   0   0   0   0   0   0   0   2   1   0
        1  2009    0   0   0   0   0   0   0   0   0   3   0   0
        2  2009    0   0   0   0   0   0   0   0   0   3   2   0

我现在这样做,我做了12个选择,每个月一个,然后把它们放在临时表中。然后我做一个巨大的连接。一切都正常,但这家伙很慢。

您可以使用查询的联合,而不是临时表,或者使用pivot选项

下面是一个关于它的论坛讨论:


这符合演示文稿的要求。
表示法和SQL并不总是很好地结合

在应用程序层隔离表示逻辑将:

  • 节省维护时间更改应用程序代码,但保持SQL完整
  • 使您能够更快地适应瞬息万变的客户需求
  • 给你更多的满足感,而不是摆弄一个交叉表或数据透视表,它几乎完全满足你的需求
  • 下面是一个在Python中执行此操作的示例(您可以使用优秀的模块连接到SQL Server):


    试试这个。因此,此代码将选择特定时间范围内的数据,然后将其转换为新列。例如,在我的sql代码中:它从“L_dt”列中选择“2014-10-01”和“2014-10-31”之间的时间范围,然后创建一个名为“十月”的新列。通过这种方式,我们可以在源自一列的不同列上布局数据

    select 
    sum(case when L_dt between '2014-10-01' and '2014-10-31' then 1 else 0 end) October,
    sum(case when L_dt between '2014-11-01' and '2014-11-30' then 1 else 0 end) November,
    sum(case when L_dt between '2014-12-01' and '2014-12-31' then 1 else 0 end) December
    from Table; 
    
    如果输入看起来像: L_dt
    2014-10-13 2014-12-21 2014-11-22 2014-10-10

    然后输出将是

    +---------+----------+----------+
    | October | November | December |
    +---------+----------+----------+
    |    2    |    1     |    1     |
    +---------+----------+----------+
    

    对于使用大查询的用户,可以使用以下选项:

    select *
    from UNNEST(GENERATE_DATE_ARRAY('2015-10-01', '2019-10-01', INTERVAL 1 MONTH))
    

    参见

    联盟……一个我不知怎么错过的明显想法。不确定这是否有帮助,但可能值得一试。是的,它应该比temps方法更有效。只需将0设置为每个查询中未参与所查询月份的select列的值。好建议。因此,此代码将选择特定时间范围内的数据,然后将其转换为新列。例如,在我的sql代码中:它从“L_dt”列中选择“2014-10-01”和“2014-10-31”之间的时间范围,然后创建一个名为“十月”的新列。通过这种方式,我们可以在一列中的不同列中排列数据。哎呀,我不知道为什么输入和输出示例的排列方式不正确。。。
    select productId, Year(dateOrdered) Year
      ,isnull(sum(case when month(dateOrdered) = 1 then Qty end), 0) Jan
      ,isnull(sum(case when month(dateOrdered) = 2 then Qty end), 0) Feb 
      ,isnull(sum(case when month(dateOrdered) = 3 then Qty end), 0) Mar
      ,isnull(sum(case when month(dateOrdered) = 4 then Qty end), 0) Apr
      ,isnull(sum(case when month(dateOrdered) = 5 then Qty end), 0) May
      ,isnull(sum(case when month(dateOrdered) = 6 then Qty end), 0) Jun
      ,isnull(sum(case when month(dateOrdered) = 7 then Qty end), 0) Jul
      ,isnull(sum(case when month(dateOrdered) = 8 then Qty end), 0) Aug
      ,isnull(sum(case when month(dateOrdered) = 9 then Qty end), 0) Sep
      ,isnull(sum(case when month(dateOrdered) = 10 then Qty end), 0) Oct
      ,isnull(sum(case when month(dateOrdered) = 11 then Qty end), 0) Nov
      ,isnull(sum(case when month(dateOrdered) = 12 then Qty end), 0) Dec
    from Table1
    group by productId, Year(dateOrdered)
    
    select 
    sum(case when L_dt between '2014-10-01' and '2014-10-31' then 1 else 0 end) October,
    sum(case when L_dt between '2014-11-01' and '2014-11-30' then 1 else 0 end) November,
    sum(case when L_dt between '2014-12-01' and '2014-12-31' then 1 else 0 end) December
    from Table; 
    
    +---------+----------+----------+
    | October | November | December |
    +---------+----------+----------+
    |    2    |    1     |    1     |
    +---------+----------+----------+
    
    select *
    from UNNEST(GENERATE_DATE_ARRAY('2015-10-01', '2019-10-01', INTERVAL 1 MONTH))