- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想让枢轴产生的所有NULL值都变成0。我在每个能想到的地方都放了ISNULL,但似乎没有任何作用。枢轴是否与 ISNULL 兼容?代码如下:
DECLARE @startDate datetime
SET @startDate = '2013-01-01'
DECLARE @sql varchar(MAX)
SET @sql = 'SELECT
CLIENTNAME, PROJECTNAME, RESOURCE, [' +
REPLACE(SUBSTRING(CONVERT(varchar, @startDate, 13), 4, 8), ' ', '') + '], [' +
REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 1, @startDate), 13), 4, 8), ' ', '') + '], [' +
REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 2, @startDate), 13), 4, 8), ' ', '') + '], [' +
REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 3, @startDate), 13), 4, 8), ' ', '') + '], [' +
REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 4, @startDate), 13), 4, 8), ' ', '') + '], [' +
REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 5, @startDate), 13), 4, 8), ' ', '') + ']
FROM
(
SELECT
CLIENTNAME, PROJECTNAME, RESOURCE, FORECASTTOTAL
FROM viewprojscheduling_group
) AS SourceTable
PIVOT
(
SUM(FORECASTTOTAL)
FOR SCHEDULEDDATE IN (' +
QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, @startDate, 13), 4, 8), ' ', '')) + ', ' +
QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 1, @startDate), 13), 4, 8), ' ', '')) + ', ' +
QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 2, @startDate), 13), 4, 8), ' ', '')) + ', ' +
QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 3, @startDate), 13), 4, 8), ' ', '')) + ', ' +
QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 4, @startDate), 13), 4, 8), ' ', '')) + ', ' +
QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 5, @startDate), 13), 4, 8), ' ', '')) + ')
) AS PivotTable'
execute(@sql)
最佳答案
我会设置您的查询略有不同,因为虽然它是动态的,因为列名在变化,但您仍然对列数进行了硬编码。
首先,我会使用递归 CTE 生成您要创建的月份/年份列表。
DECLARE @startDate datetime
SET @startDate = '2013-01-01'
;with dates as
(
select @startdate datelist, 1 sp
union all
select dateadd(month, 1, datelist), sp+1
from dates
where sp+1 <= 5 -- change this number 5 to the number of months you need
)
select sp,
REPLACE(SUBSTRING(CONVERT(varchar(11), datelist, 13), 4, 8), ' ', '') MONTHANDYEAR
from dates
参见 SQL Fiddle with Demo .这将自动创建包含年份的 5 个月的列表。那么您就不会对 5 列进行硬编码。您当前的查询不够灵活。如果您想要 12 个月,将会发生什么,您将不得不更改您的代码。
生成日期列表后,我会将其插入到临时表中,以便您可以使用它来获取列。
获取列列表的代码是:
select @cols = STUFF((SELECT ',' + QUOTENAME(monthandyear)
from #datesTemp
group by monthandyear, sp
order by sp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colNames = STUFF((SELECT ', isnull(' + QUOTENAME(monthandyear)+', 0) as '+QUOTENAME(monthandyear)
from #datesTemp
group by monthandyear, sp
order by sp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
参见 SQL Fiddle with Demo .你会看到有两个版本。第一个@cols
获取将在 pivot
中使用的列列表.第二个@colNames
将在最后使用 SELECT
替换 null
的列表带零的值。
然后将它们放在一起,代码将是:(注意:我使用的是您的 previous question 中我的答案版本)
DECLARE @cols AS NVARCHAR(MAX),
@colNames AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@startDate datetime
SET @startDate = '2013-01-01'
;with dates as
(
select @startdate datelist, 1 sp
union all
select dateadd(month, 1, datelist), sp+1
from dates
where sp+1 <= 5 -- change this number 5 to the number of months you need
)
select sp,
REPLACE(SUBSTRING(CONVERT(varchar(11), datelist, 13), 4, 8), ' ', '') MONTHANDYEAR
into #datesTemp
from dates
select @cols = STUFF((SELECT ',' + QUOTENAME(monthandyear)
from #datesTemp
group by monthandyear, sp
order by sp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colNames = STUFF((SELECT ', isnull(' + QUOTENAME(monthandyear)+', 0) as '+QUOTENAME(monthandyear)
from #datesTemp
group by monthandyear, sp
order by sp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT resource, clientname,' + @colNames + '
from
(
select [CLIENTNAME], [RESOURCE], [FORECASTTOTAL],
REPLACE(SUBSTRING(CONVERT(varchar(11), SCHEDULEDDATE, 13), 4, 8), '' '', '''') monthandyear
from viewprojscheduling_group
) x
pivot
(
sum(FORECASTTOTAL)
for monthandyear in (' + @cols + ')
) p '
execute(@query)
参见 SQL Fiddle with Demo .此查询将为您提供结果:
| RESOURCE | CLIENTNAME | JAN2013 | FEB2013 | MAR2013 | APR2013 | MAY2013 |
---------------------------------------------------------------------------
| res1 | abc | 1000 | 2000 | 0 | 0 | 0 |
| res1 | def | 0 | 0 | 2000 | 0 | 0 |
| res2 | def | 1500 | 0 | 0 | 0 | 0 |
| res3 | ghi | 0 | 0 | 2500 | 0 | 0 |
关于sql-server-2008 - SQL : Using ISNULL with dynamic pivot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15150068/
我不知道此行为是设计使然还是 EF6 中的错误,或者是否有其他方法可以执行此操作。具有这种复杂类型: [ComplexType] public partial class Company
我正在尝试使用 gulp 编译 React (.jsx)、coffeescript (.coffee) 和 vanilla javascript (.js) 文件,将所有生成的 .js 文件打包到一个
是否有像 ISNULL() 或 COALESCE() 这样的东西,但不是检查空值而是检查空值。 例如: SELECT cu.last_name, cu.first_name, cu.email,
我有一个存储过程: [checkCultureCode] @InputCulture varchar(5) = 'en-US', @ValidCulture varchar(5) OUTPUT AS
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我有一个日期列,其中一些行有 NULL 值。我想使用 ISNULL 或类似的东西来用“N/A”之类的东西替换这些值,但是,当我尝试使用 ISNULL 时,由于两种不同的数据类型,我收到一个错误。如果我
因此,我目前正在使用 SSIS 2008 从旧的 Advantage 数据库服务器迁移到 SQL 2005。旧的 Advantage 数据库中的列之一是 MEMO 类型。默认情况下,这会转换为 DT_
我有下面的代码,它返回邮政编码的访问顺序。我能够正确返回邮政编码,但为了使数据更加用户友好,我在邮政编码之间添加了破折号(-)。 问题来自于这样一个事实:我无法弄清楚如何消除只有 2 或 3 个邮政编
我在存储过程中有以下逻辑。 这里完成了什么? 如果color为null,替换为'' IF ISNULL(@color, '') <> '' BEGIN END 最佳答案 它等同于: IF (@colo
如何检查一个字符串是否为 null,如果为 null 则将其设置为某个值? 就像在 SQL 中一样, isnull(string, 0) 最佳答案 你可以测试空值: if (s == null)
先来有用的 复制代码代码如下: use 数据库 update news set author='jb51' where author is null 如果你的不正
我有一个 User 实体,我尝试通过与 UserGroup 的多对多关系加入它。它工作正常,但我尝试过滤连接的实体,因为我使用了一个软删除字段。 class User { // ...
在没有记录匹配的情况下 ICAO='YXTO' SELECT 1, ISNULL((SELECT ID FROM Location WHERE ICAO='YXTO'),2) 返回 1,2 鉴于 SE
我正在尝试将名为“Number”的列字段的值增加 1,如果该值当前为 Null,我想将该值设置为 1,因为 Null 值无法增加。我发现了 isNull() 函数并且没有使用以下语句获得结果: Upd
我想确认数组已创建,怎么办?有没有nul关键字? Dim items As Array = str.Split("|") if (items=null) then ??? 最佳答案 要检查 VB.N
我有一个日期时间字段,它可以为空,id 喜欢做 qs.order_by('field__isnull', 'name') 但这会导致: Join on field 'field' not permit
我有一张大 table 用户 和一张小 table 用户_购买在谷歌大查询中。 如果我加入这两个 SELECT User.id, User_purchase.amount FROM User
[表] USER_INFO user_id | user_name a123 | facebook b123 | google c123 | NULL [询问] se
我有一个数据框 df。代码是这样写的 df.isnull().mean().sort_values(ascending = False) 这是输出的一部分- inq_fi
Cyan 45.0 HG8-Bla
我是一名优秀的程序员,十分优秀!