2016-06-29 2 views
2

У меня есть таблица тест SQLite для хранения данных отчетов со значениями:SQLite HAVING ошибки сравнения

CREATE TABLE IF NOT EXISTS "test_fact_daily_revenue" (
"date" TEXT, 
"revenue" NUMERIC, 
"product" TEXT 
); 

INSERT INTO "test_fact_daily_revenue" 
("date", "revenue", "product") 
VALUES 
('2014-01-01', 3, 'Nerds'), 
('2014-01-01', 2, 'Laffy Taffy'), 
('2014-01-02', 1, 'Smarties'), 
('2014-01-02', 5, 'Laffy Taffy'), 
('2014-01-03', 0.5, 'Smarties'), 
('2014-01-03', 1, 'Skittles'); 

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

SELECT 
    typeof(SUM(revenue)) AS revenue, 
    typeof(product) AS product 
FROM test_fact_daily_revenue 
WHERE revenue > 1 
GROUP BY product; 

integer|text 
integer|text 

Но когда я пытаюсь сделать HAVING условие с использованием агрегата (SUM) столбца доходов, результат неверен. 7 не меньше 5.

SELECT 
    test_fact_daily_revenue.product AS "product", 
    SUM(test_fact_daily_revenue.revenue) AS "revenue" 
FROM "test_fact_daily_revenue" 
WHERE 
    "test_fact_daily_revenue"."product" IS NOT NULL 
GROUP BY "test_fact_daily_revenue"."product" 
HAVING 
    SUM(test_fact_daily_revenue.revenue) < 5 

Laffy Taffy|7 
Nerds|3 
Skittles|1 
Smarties|1.5 

Если я повторить тот же тест с MySQL, он работает, как ожидалось, отфильтровывая строки Laffy Таффи. Есть ли хорошее объяснение этому?

+0

Ваш запрос выглядит правильно: я не могу воспроизвести вашу проблему: http://sqlfiddle.com/# ! 5/c1426/1 – sgeddes

+0

Я использую PHP 5.6 PDO 'sqlite' engine с файлом базы данных ': memory:'. Возможно, это проблема с версией. –

+0

Кроме того, если я изменяю предложение HAVING как 'SUM (test_fact_daily_revenue. доход)> 5', я не получаю строк назад. –

ответ

2

Это проблема с драйвером PHP PDO и подготовленными операциями! Следующий подготовленный оператор не работает, если связанный параметр является флагом PHP, потому что PHP может связывать его только как INTEGER или STRING (а строка - рекомендуемый тип параметра для десятичных знаков). Поскольку в моей колонке могут быть значения DECIMAL, библиотека, которую я использую, связывает ее как STRING. SQLite имеет странное поведение для сравнения строк, даже если они являются числовыми. Чтобы обойти это, мне придется избегать подготовленных заявлений ... :-(

SELECT 
    test_fact_daily_revenue.product AS "product", 
    SUM(test_fact_daily_revenue.revenue) AS "revenue" 
FROM "test_fact_daily_revenue" 
WHERE 
    "test_fact_daily_revenue"."product" IS NOT NULL 
GROUP BY "test_fact_daily_revenue"."product" 
HAVING 
    SUM(test_fact_daily_revenue.revenue) < ? 
Смежные вопросы