Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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/4/sql-server-2008/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 Server_Sql Server 2008 - Fatal编程技术网

Sql server 根据其他列按月显示记录

Sql server 根据其他列按月显示记录,sql-server,sql-server-2008,Sql Server,Sql Server 2008,以下是我的表格包含的数据。我也分享了我对结果的需求。 基于IPAddress列,我必须统计数据并按月显示,就像特定月份的in-IP地址和Out-Side-IP地址一样 这是DDL和示例数据: CREATE TABLE [#IPAddress]( [DEPTNO] [numeric](2, 0) NULL, [HIREDATE] [datetime] NULL, [IPAddress] [int] NULL ) ON [PRIMARY] GO INSERT [db

以下是我的表格包含的数据。我也分享了我对结果的需求。 基于IPAddress列,我必须统计数据并按月显示,就像特定月份的in-IP地址和Out-Side-IP地址一样

这是DDL和示例数据:

CREATE TABLE [#IPAddress](
    [DEPTNO] [numeric](2, 0) NULL,
    [HIREDATE] [datetime] NULL,
    [IPAddress] [int] NULL
) ON [PRIMARY]    
GO

INSERT [dbo].[#IPAddress] ([DEPTNO], [HIREDATE], [IPAddress]) 
VALUES (CAST(20 AS Numeric(2, 0)), CAST(0x0000738200000000 AS DateTime), 14)    
, (CAST(30 AS Numeric(2, 0)), CAST(0x000073C300000000 AS DateTime), 6)    
, (CAST(30 AS Numeric(2, 0)), CAST(0x000073C500000000 AS DateTime), 18)    
, (CAST(20 AS Numeric(2, 0)), CAST(0x000073EC00000000 AS DateTime), 1)    
, (CAST(30 AS Numeric(2, 0)), CAST(0x0000749F00000000 AS DateTime), 13)    
, (CAST(30 AS Numeric(2, 0)), CAST(0x0000740900000000 AS DateTime), 9)    
, (CAST(10 AS Numeric(2, 0)), CAST(0x0000743000000000 AS DateTime), 1)    
, (CAST(20 AS Numeric(2, 0)), CAST(0x0000765400000000 AS DateTime), 13)    
, (CAST(10 AS Numeric(2, 0)), CAST(0x000074D100000000 AS DateTime), 15)    
, (CAST(30 AS Numeric(2, 0)), CAST(0x0000748B00000000 AS DateTime), 19)    
, (CAST(20 AS Numeric(2, 0)), CAST(0x0000767600000000 AS DateTime), 12)    
, (CAST(30 AS Numeric(2, 0)), CAST(0x000074E100000000 AS DateTime), 1)    
, (CAST(20 AS Numeric(2, 0)), CAST(0x000074E100000000 AS DateTime), 1)    
, (CAST(10 AS Numeric(2, 0)), CAST(0x0000751400000000 AS DateTime), 2)
我的要求是:

SELECT *
FROM (
select DEPTNO, datename(month,HIREDATE) [month],COUNT(IPAddress) Amount from [#IPAddress] where IPAddress between 1 and 10 group by DEPTNO,datename(month,HIREDATE)
) as s
PIVOT
(
    SUM(Amount) FOR [month] IN (December,February,January,November,September)
)AS pvt

SELECT *
FROM (
select DEPTNO, datename(month,HIREDATE) [month],COUNT(IPAddress) Amount from [#IPAddress] where IPAddress between 11 and 20 group by DEPTNO,datename(month,HIREDATE)
) as s
PIVOT
(
    SUM(Amount) FOR [month] IN (December,February,January,November,September)
)AS pvt
执行上述查询后,我得到2个结果集

但我希望数据类似于-

select 10 DeptNo,null DecemberInIPAddress,null DecemberOutIPAddress,null FebruaryInIPAddress,null FebruaryOutIPAddress,1 JanuaryInIPAddress,null JanuaryOutIPAddress,
null NovemberInIPAddress,1 NovemberOutIPAddress, null SeptemberInIPAddress,null SeptemberOutIPAddress 
union
select 20 DeptNo,1 DecemberInIPAddress,2 DecemberOutIPAddress,null FebruaryInIPAddress,null FebruaryOutIPAddress,null JanuaryInIPAddress,1 JanuaryOutIPAddress,
null NovemberInIPAddress,null NovemberOutIPAddress, null SeptemberInIPAddress,null SeptemberOutIPAddress 
union
    select 30 DeptNo,1 DecemberInIPAddress,null DecemberOutIPAddress,1 FebruaryInIPAddress,1 FebruaryOutIPAddress,null JanuaryInIPAddress,null JanuaryOutIPAddress,
    null NovemberInIPAddress,null NovemberOutIPAddress, null SeptemberInIPAddress,2 SeptemberOutIPAddress 

最后一个查询给出一个结果集,我希望得到这样的结果。

要获得所需的输出,您可以轻松地使用两个查询并在DeptNo上进行连接,如下所示:

;WITH in_IPaddress
AS (
    SELECT *
    FROM (
        SELECT DEPTNO
            ,datename(month, HIREDATE) [month]
            ,IPAddress
        FROM [#IPAddress]
        WHERE IPaddress BETWEEN 1 AND 10
        ) AS s
    PIVOT(COUNT(IPAddress) FOR [month] IN (December,February,January,November,September)
    ) AS pvt
    ),
out_IPAddress
AS (
    SELECT *
    FROM (
        SELECT DEPTNO
            ,datename(month, HIREDATE) [month]
            ,IPAddress
        FROM [#IPAddress]
        WHERE IPaddress BETWEEN 11 AND 20
        ) AS s
    PIVOT(COUNT(IPAddress) FOR [month] IN (December,February,January,November,September)
    ) AS pvt
    )
SELECT 
      i.deptno
    ,i.December AS DecemberInIp
    ,o.December AS DecemberOutIp
    ,i.February AS FebruaryInIp
    ,o.February AS FebruaryOutIp
    ,i.January AS JanuaryInIp
    ,o.January AS JanuaryOutIp
    ,i.November AS NovemberInIp
    ,o.November AS NovemberOutIp
    ,i.September AS SeptemberInIp
    ,o.September AS SeptemberOutIp
FROM in_IPAddress i
LEFT JOIN out_IPAddress o ON i.deptNO = o.DeptNo;
另一方面,我也调整了pivot查询:删除了GroupBy,而不是IPAddress上的sum,而是使用count。此外,您可能会注意到输出结果返回的是0,而不是空值,可以在外部查询中使用“case-when”语句轻松替换空值

更新:

因为列名不是静态的,所以需要使用动态透视来构建它们。此外,我将创建另一个名为in_out_flag的列来区分月份,而不是将列名与条件输入和输出连接起来

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(datename(month,c.hiredate)) 
            FROM [dbo].[#IPAddress] c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT DEPTNO, In_Out_Flag, ' + @cols + ' from 
            (
                select DEPTNO
                ,case 
                    when IPaddress between 1 and 10
                        then ''In''
                else ''Out''
                end as in_out_flag
                ,datename(month,HIREDATE) [month]
                ,IPAddress  
                from [#IPAddress] 
            ) x
            pivot 
            (
                 count(IPAddress)
                for [month] in (' + @cols + ')
            ) p '

EXEC sp_executesql @query;

那你为什么不能得到你想要的?你有错误吗?请发布您的尝试,以及出现了什么问题。您如何确定输入和输出IP地址?@Tab Alleman,实际上月份名称是动态的。“但我在这里硬编码了。”FutbolFan,他们给了我一系列IP地址。如果介于两者之间,则在国内,否则在国外。我的列名是月份名称。这些也会随着日期范围参数的变化而动态变化。我在你最初的问题中没有看到这些信息。我认为这将是你问题的一个重要部分。