2015-08-12 3 views
-3

Ниже приведены данные, которые содержит моя таблица. Я также поделился запросами, как мне нужен результат. Основываясь на столбце IPAddress, я должен подсчитывать данные и показывать их по месяцам, например, с IP-адресом и внешней стороной 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 

Окончательный запрос дает один набор результатов, я хочу привести, как это.

+0

Так почему вы не можете получить то, что вы хотите? Вы получаете сообщение об ошибке? Пожалуйста, разместите свою попытку, и что с ней не так. –

+0

Как вы определяете, что такое 'IN' и' OUT' IP-адрес? – FutbolFan

+0

@Tab Alleman, На самом деле имена месяцев динамичны. Но я здесь жестко закодирован. –

ответ

0

Для достижения желаемого выхода, вы можете легко использовать два ваши запросы и сделать объединение по 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; 

Code Demo

На стороне, я подправил свой сводной запрос, а также: удалил group by и вместо sum на IPAddress, вместо этого я использовал count. Кроме того, вы можете заметить, что результат вывода возвращает 0 вместо нулевых значений, которые можно легко заменить, используя оператор case в своем внешнем запросе.

UPDATE:

Поскольку ваше имя столбца не являются статическими, вам нужно будет использовать динамический стержень, чтобы построить их. Кроме того, вместо того, чтобы присоединять имя столбца к условному in и out, я бы создал еще один столбец с именем 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; 

Dynamic Pivot Demo

+0

Мои имена столбцов - это имена месяцев. Они также динамически изменяются с параметрами диапазона дат. –

+0

Я не видел эту информацию в вашем исходном вопросе. Я бы подумал, что это будет важной частью вашего вопроса. – FutbolFan

Смежные вопросы