Сводная таблица SQL, создающая дубликаты - PullRequest
0 голосов
/ 12 октября 2011

Разработчики,

Я новичок в сводных таблицах, и у меня возникла небольшая проблема с дубликатами.Моя таблица перед поворотом выглядит так:

location | еда
Теннесси |груша
Теннесси |оранжевый
Флорида |оранжевый
Флорида |яблоко
Вирджиния |pear

Вот код для pivot, который отлично работает:

SELECT PivotTable.location, [apple], [orange], [pear]
FROM
(SELECT location, food FROM someTable) as inventory
PIVOT
(COUNT(inventory.food) FOR inventory.location IN ([apple],[orange],[pear])) AS PivotTable

Это приводит к выводу примерно так:

Location | Apple | Оранжевый | Груша
Теннесси |0 |1 |1
Флорида |1 |1 |0
Вирджиния |0 |0 |1

Что, как я уже сказал, работает нормально.Тем не менее, я добавил новые столбцы для комментариев к моей исходной таблице, например:

location | еда | apple_comments | orange_comments | pear_comments

Теннесси |груша |NULL |NULL |NULL
Теннесси |апельсин |NULL |очень сочная |NULL
Флорида |апельсин |NULL |NULL |NULL
Флорида |яблоко |свежий |NULL |NULL
Вирджиния |груша |NULL |NULL |вкусно

Вот моя измененная сводная таблица для учета комментариев:

SELECT PivotTable.location, [apple], [apple_comments], [orange], [orange_comments], [pear], [pear_comments]
FROM
(SELECT location, food, apple_comments, orange_comments, pear_comments FROM someTable) as inventory
PIVOT
(COUNT(inventory.food) FOR inventory.location IN ([apple],[orange],[pear])) AS PivotTable

Это приводит к выводу примерно так:

Местоположение | Apple | apple_comments | Оранжевый | Orange_comments | Груша | Pear_comments
Теннесси |0 |NULL |0 |NULL |1 |NULL
Теннесси |0 |NULL |1 |очень сочная |0 |NULL
Флорида |0 |NULL |1 |NULL |0 |NULL
Флорида |1 |свежий |1 |NULL |0 |NULL
Вирджиния |0 |NULL |1 |NULL |1 |вкусно

Итак, по сути, создается дублирующаяся строка, когда комментарии добавляются для каждой записи, где есть несколько мест.В случае Вирджинии есть только одна запись, поэтому ряд получается нормально.

Почти кажется, что мне нужно сделать еще один круг или что-то в этом роде.Может кто-нибудь дать совет, где я иду не так?

Извините.Желаемый результат должен выглядеть так:

Местоположение | яблоко | apple_comments | Оранжевый | Orange_comments | Груша | Pear_comments
Теннесси |0 |NULL |1 |очень сочная |1 |NULL
Флорида |1 |свежий |1 |NULL |0 |NULL
Вирджиния |0 |NULL |1 |NULL |1 |вкусно

По сути, объединение дубликатов в один ряд.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 октября 2011

Найден ответ (используются функции 'с CTE' и MAX):

;With CTE as (
SELECT PivotTable.location, [apple], [apple_comments], [orange], [orange_comments], [pear], [pear_comments]
FROM
(SELECT location, food, apple_comments, orange_comments, pear_comments FROM someTable) as inventory
PIVOT
(COUNT(inventory.food) FOR inventory.location IN ([apple],[orange],[pear])) AS PivotTable)
select location, MAX([apple]) as [apple], MAX([apple_comments]) as [apple_comments],MAX([orange]) as [orange], 
MAX([orange_comments]) as [orange_comments], MAX([pear]) as [pear], MAX([pear_comments]) as [pear_comments]
from CTE group by location
0 голосов
/ 12 октября 2011

Основная проблема заключается в том, что вы фактически указали компилятору группировать по столбцу comment в дополнение к столбцу food. Есть несколько решений, таких как сведение комментариев в список с разделителями, например:

Select location
    , Sum( Case When S.food = 'Apple' Then 1 Else 0 End ) As Apple
    , Stuff(
        (
        Select ', ' + S1.Apple_Comments
        From SomeTable As S1
        Where S1.location = S.location
            And S1.Apple_Comments Is Not Null
        Group By S1.Apple_Comments
        For Xml Path(''), type
        ).value('.','nvarchar(max)')
        , 1, 2, '') As Apple_Comments
    , Sum( Case When S.food = 'Orange' Then 1 Else 0 End ) As Orange
    , Stuff(
        (
        Select ', ' + S1.Orange_Comments
        From SomeTable As S1
        Where S1.location = S.location
            And S1.Orange_Comments Is Not Null
        Group By S1.Orange_Comments
        For Xml Path(''), type
        ).value('.','nvarchar(max)')
        , 1, 2, '') As Orange_Comments
    , Sum( Case When S.food = 'Pear' Then 1 Else 0 End ) As Pear
    , Stuff(
        (
        Select ', ' + S1.Pear_Comments
        From SomeTable As S1
        Where S1.location = S.location
            And S1.Pear_Comments Is Not Null
        Group By S1.Pear_Comments
        For Xml Path(''), type
        ).value('.','nvarchar(max)')
        , 1, 2, '') As Pear_Comments
From SomeTable As S
Group By S.location
...