Почему этот запрос возвращает нежелательные результаты? - PullRequest
0 голосов
/ 27 января 2009

Доброе утро,

У меня проблема с этим запросом:

SELECT  
    P.txt_nome AS Pergunta,   
    IP.nome AS Resposta,   
    COUNT(*) AS Qtd   
FROM  
    tb_resposta_formulario RF   
    INNER JOIN formularios F ON  
        F.id_formulario = RF.id_formulario   
    INNER JOIN tb_pergunta P ON  
        P.id_pergunta = RF.id_pergunta   
    INNER JOIN tb_resposta_formulario_combo RFC ON  
        RFC.id_resposta_formulario = RF.id_resposta_formulario   
    INNER JOIN itens_perguntas IP ON  
        IP.id_item_pergunta = RFC.id_item_pergunta   
WHERE  
    RF.id_formulario = 2   
GROUP BY    
    P.txt_nome,   
    IP.nome   

Это фактический результат этого запроса:

| Pergunta | Resposta | Qtd |
| Продукты | Комбо 1MB | 3 |
| Продукты | Комбо 2MB | 5 |
| Продукты | Комбо 4MB | 1 |
| Продукты | Комбо 6MB | 1 |
| Продукты | Комбо 8MB | 4 |
| Região | MG | 3 |
| Região | PR | 2 |
| Região | RJ | 3 |
| Região | SC | 1 |
| Região | SP | 5 |

Вот результаты, которые я ожидал:

| Produto | Região | Qtd |
| Combo 1MB | MG | 3 |
| Combo 2MB | SP | 5 |
| Combo 4MB | SC | 1 |
| Combo 6MB | RJ | 1 |
| Combo 8MB | PR | 2 |

Я использую операторы PIVOT и UNPIVOT, но результат неудовлетворительный.

Кто-нибудь уже сталкивался с такой ситуацией раньше? Есть ли у вас какие-либо идеи, которые вы можете предложить?

Я уже проанализировал эти ссылки:

Att, Pelegrini

1 Ответ

2 голосов
/ 27 января 2009

«Очевидный» ответ: потому что запрос неправильный. Мы действительно ничего не знаем о структуре таблицы и о том, чего вы пытаетесь достичь.

Относительно по крайней мере одной очень простой проблемы в вашем запросе: вы ожидаете столбцы |Produto | Região |Qtd| в своем ответе, но запрос однозначно выбирает столбцы Pergunta, Reposta и Qtd, что совпадает результат вы получаете.

Насколько хорошо вы знакомы с SQL вообще? Возможно, стоит прочитать вступительный текст. Я бы предложил это как хорошее введение. (Использует Oracle, но принципы те же)

...