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代码中:它从“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_dt2014-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))