2015-01-23 6 views
0

Я пытаюсь использовать опорную точку на нескольких столбцах. В настоящее время я могу добиться этого только одним столбцом. Мой текущий метод возвращает:SQL Server Pivot on Multiple Columns - Другое измерение

Membership Item1 
DO1   400 
Neither  21 
Plan A  69 
Plan B  53 

Но вот что я пытаюсь достичь:

Membership Item1 Item2 Item3 Item3 Item4 Item5 
DO1   30  300  25  14  10  144 
Neither  35  250  30  30  5  125 
Plan A  50  100  25  25  5  254 
Plan B  100  25  15  25  4  123 

Вот мой код

WITH CTE_SQL 
AS 
(
    SELECT CaseId 
      ,Item1 AS Number1 
      ,[Membership] -- ,Item2 AS Number2,Item3 AS Number3,Item4 AS Number4,Item5 AS Number5 
      FROM TABLE1 
      WHERE [Membership] IS NOT NULL 
) 
SELECT [Membership] 
     ,Item1 --,Item2--,Item3 AS 'Item3',Item4 AS 'Item4',Item5 AS 'Item5' 
FROM 
(
    SELECT CaseId 
      ,Number1 
      ,[Membership] --,[Item2],[Item3],[Item4],[Item5] 
      FROM CTE_SQL 
) AS p 
PIVOT 
(
    COUNT(CaseId) 
    FOR Number1 IN (Item1) 
) AS pvt 
ORDER BY [Membership] 

Любое понимание? Обновление Вот схемы таблицы

ColumnName DataType Allow Nulls 
.......... ........ ........... 
CaseId nvarchar(50)  No 
Membership nvarchar(50) Yes 
Item1  nvarchar(50)  Yes 
Item2  nvarchar(50)  Yes 
Item3  nvarchar(50)  Yes 
Item4  nvarchar(50)  Yes 
Item5  nvarchar(50)  Yes 

Так вот это обновление последней. Это мой источник данных:

CREATE TABLE TABLE1 
(CASENumber NVARCHAR(50),Membership NVARCHAR(50),Item1 NVARCHAR(50),Item2 NVARCHAR(50),Item3 NVARCHAR(50),Item4 NVARCHAR(50),Item5 NVARCHAR(50)) 

INSERT INTO TABLE1 
SELECT 'Case001', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'PlanA','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'PlanA','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'PlanA','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'PlanA','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case004', 'Neither','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case005', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case001', 'PlanB','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case002', 'D01','Gold','Silver','Diamond','Steel','Wood' 
UNION ALL 
SELECT 'Case003', 'Neither','Gold','Silver','Diamond','Steel','Wood' 

И здесь я застрял с моим кодом и на выходе у меня до сих пор:

WITH CTE_SQL 
    AS 
    (
     SELECT CASENumber,Item1 AS Number1,[Membership]--,Item2 AS Number2, 
     Item3 AS Number3,Item4 Number4,Item5 AS Number5 
     FROM dbo.TABLE1 
     WHERE [Membership] IS NOT NULL 

) 
    SELECT Membership,Gold as 'Item1' --,Item2--,Item3 AS 'Item3', 
    Item4 AS 'Item4',Item5 AS 'Item5' 
    FROM 
    (
     SELECT CaseNumber,Number1,Membership--,[Item2],[Item3],[Item4],[Item5] 
     FROM CTE_SQL 
    ) AS p 
    PIVOT 
    (
     COUNT(CASENumber) 
     FOR Number1 in(Gold) 
    ) as pvt 

Выходной ток

Membership Item1 
......... ..... 
D01   7 
Neither  9 
PlanA   4 
PlanB  13 

Предназначенный Выход

Membership Item1 Item2 Item3 Item4 Item5 
.......... ..... ..... ..... ..... ..... 
D01   7  7  7  7  7 
Neither  9  9  9  9  9 
PlanA  4  4  4  4  4 
PlanB  13  13  13  13  13 

Обратите внимание, что все элементы под столбцами items1 являются золотыми. То же самое относится к пунктам 2-5 с Silver, Diamond, Steel и Wood соответственно.

+0

Можете ли вы предоставить данные? –

+0

Данные примера приведены выше до кода – user3424320

+0

Я думал, что это ожидаемый результат? –

ответ

0

Для получения результата необходим динамический стержень.

переменная Declare, чтобы получить столбцы для поворота

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + Number1 + ']', '[' + Number1 + ']') 
        FROM (SELECT DISTINCT Number1 FROM #TEMP) PV 
        ORDER BY Number1 

Теперь откинуть запрос

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT Membership, Number1, 
       -- Get the count here 
       COUNT(CASEID) OVER(PARTITION BY Membership,Number1) CNT 
       FROM #TEMP 
       WHERE Membership IS NOT NULL 
      ) x 
      PIVOT 
      (
       MIN(CNT) 
       FOR Number1 IN (' + @cols + ') 
      ) p 
      ORDER BY Membership;' 

EXEC SP_EXECUTESQL @query 
  • Click here для просмотра результат

EDIT:

В соответствии с вашим обновления, если вам нужен счетчик CaseId для каждого члена, вы можете использовать приведенный ниже запрос

;WITH CTE AS 
(
    SELECT DISTINCT Membership, 
    COUNT(CASEID) OVER(PARTITION BY Membership) CNT 
    FROM TABLE1 
    WHERE Membership IS NOT NULL 
) 
SELECT Membership,CNT AS Item1,CNT AS Item2,CNT AS Item3,CNT AS Item3,CNT AS Item4,CNT AS Item5 
FROM CTE 
  • Click here для просмотра результат

EDIT 2:

Дорогой друг. Это простой процесс. Мы можем сделать это без поворота.Мы можем использовать метод PARTITION BY() в Sql Server, которые получают общее количество CASENUMBER за каждые Membership.

SELECT DISTINCT [Membership], 
COUNT(Item1) OVER(PARTITION BY [Membership]) AS Item1, 
COUNT(Item2) OVER(PARTITION BY [Membership]) AS Item2, 
COUNT(Item3) OVER(PARTITION BY [Membership]) AS Item3, 
COUNT(Item4) OVER(PARTITION BY [Membership]) AS Item4, 
COUNT(Item5) OVER(PARTITION BY [Membership]) AS Item5 
FROM TABLE1 
WHERE [Membership] IS NOT NULL 
ORDER BY MEMBERSHIP 
  • Click here для просмотра результата

РЕЗУЛЬТАТ

x-------------x-----------x----------x----------x---------x---------x 
| Membership | Item1 | Item2 | Item3 | Item4 | Item5 | 
x-------------x-----------x----------x----------x---------x---------x   
| D01  |  7 | 7  |  7 | 7 |  7 | 
| Neither |  9 | 9  |  9 | 9 |  9 | 
| Plan A |  4 | 4  |  4 | 4 |  4 | 
| Plan B |  13 | 13 | 13 | 13 | 13 | 
x-------------x-----------x----------x----------x---------x---------x 
+0

Спасибо, но если вы посмотрите на исходный запрос моего запроса, item1 (и комментарий item2 -item5) являются настоящими столбцами. Ваше решение имеет только номер 1. Я ищу ситуацию, когда CREATE TABLE TEMP (CASEID INT, членство VARCHAR (30), NUMBER1 VARCHAR (30), NUMBER2 VARCHAR (30), NUMBER3 VARCHAR (30), NUMBER4 VARCHAR (30), NUMBER5 VARCHAR (30)) – user3424320

+0

Вы хотите взять счет Case_id в каждом членстве из вашей исходной таблицы (Таблица 1)? @ user3424320 –

+0

Да, это мое намерение. – user3424320