2015-03-22 4 views
0

Мне нужно предложение по сводному отчету. У меня есть таблица, как показано ниже (несколько примеров записей). У меня есть устройства, установленные в магазинах (многие - многие отношения между устройством и магазином). вычислить количество в списке устройств (предположим 300-320) в течение определенного периода времени (предположим один год). Если deviceid существует в списке, то счет будет добавлен в соответствующий месяц. Если deviceid присутствует в период времени, но не в списке, другие подсчеты будут увеличиваться.sql server dynamic pivoting

Я подготовил динамический сводный запрос, чтобы получить подсчет для данных за один год. Запрос работает для списка устройств. Но я смущен, чтобы получить другое устройство. Пожалуйста, предложите или введите некоторые данные или динамический запрос. Спасибо заранее. Извините за мой бедный английский.

ввода Таблица:
DeviceID, StoreID, SaleDate
306,44070,2006-02-02 21: 58: 29,790
307,44071,2006-03-02 22: 00: 08,853
306,44070,2006-04-02 22: 14: 36,773
308,44071,2006-04-02 22: 15: 31,320
306,44072,2006-02-18 13: 39: 18,380
307,44073,2006-03-18 13: 46: 55,397
392,44070,2006-02-18 13: 53: 47.647
307,44070,2006-04-18 14: 03: 23,930
308,44071,2006-02-19 14: 54: 06,930
390,44070,2006-04-12 15: 16: 51,537

Выход1: (количество в месяц на устройство)
DeviceID, [февраль-06], [Март-06], [Апрель-06]
306,2,0,1
307,0,2,1
308,2,0,0
Другие, 1,0, 1

Выход2: (кол-отчетливый магазина на устройство в месяц)
DeviceID, StoreID, [февраль-06], [Март-06], [APR- 06]
306,2,2,0, 1
307,3,0,2, 1
308,1,2,0,0
Другие, 1,1, 0, 1

+2

вы можете оставить то, что вы пробовали до сих пор – mohan111

+0

Будьте конкретны о том, что вы спрашиваете .. – tharif

ответ

0

Попробуйте это и изменить соответственно

DECLARE @COLS VARCHAR(MAX); 
DECLARE @COLS_ALIAS VARCHAR(MAX); 
DECLARE @SQL NVARCHAR(MAX); 

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(Datename(MONTH, Sale_Date)) 
       from #Your_table 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,''); 
select @COLS_ALIAS = STUFF((SELECT DISTINCT ',ISNULL(Max(' + QUOTENAME(Datename(MONTH, Sale_Date))+ '),0) AS '+ QUOTENAME(Datename(MONTH, Sale_Date)) 
      from #Your_table 
    FOR XML PATH(''), TYPE 
    ).value('.', 'NVARCHAR(MAX)') 
,1,1,''); 


SET @SQL='SELECT A.DEVICE_ID, 
     YEAR, 
     RN AS COUNT_DISTINCT,'[email protected]+' 
FROM (SELECT TEMP      AS DEVICE_ID, 
       Max(YEAR)     YEAR, 
       Max(COUNT1)     AS COUNT,'[email protected]_ALIAS+' 
     FROM (SELECT A.Device_id, 
         Count(A.Device_id)   AS COUNT, 
         Count(A.Device_id)   AS COUNT1, 
         Datename(MONTH, Sale_Date) AS MONTH, 
         Year(Sale_Date)   AS YEAR, 
         (CASE 
          WHEN A.Device_id = 306 THEN ''306'' 
          WHEN A.Device_id = 307 THEN ''307'' 
          WHEN A.Device_id = 308 THEN ''308'' 
          ELSE ''Others'' 
         END)     AS TEMP 
       FROM #Your_table A 
       GROUP BY A.Device_id, 
          Datename(MONTH, Sale_Date), 
          Year(Sale_Date)) A 
       PIVOT (Max(COUNT) 
        FOR MONTH IN ('[email protected]+'))PV 
     GROUP BY TEMP)A 
     JOIN (SELECT TEMP AS Device_id, 
        Sum(RN) AS RN 
      FROM (SELECT Device_id, 
          Row_number() 
           OVER(
           PARtition BY DEvice_id, Store_id 
           ORDER BY device_id) AS RN, 
          (CASE 
          WHEN Device_id = 306 THEN ''306'' 
          WHEN Device_id = 307 THEN ''307'' 
          WHEN Device_id = 308 THEN ''308'' 
          ELSE ''Others'' 
         END)     AS TEMP 
        FROM #Your_table)A 
      WHERE RN = 1 
      GROUP BY TEMP)B 
     ON A.Device_id = B.Device_id' 

EXECUTE sp_executesql @SQL