-- create a table
CREATE TABLE PhoneBase (City TEXT NOT NULL, Phone TEXT NOT NULL,
Type TEXT NOT NULL);
-- insert some values
INSERT INTO PhoneBase VALUES ('Тамбов', '9001111111', 'm');
INSERT INTO PhoneBase VALUES ('Липецк', '9051234095', 'm');
INSERT INTO PhoneBase VALUES ('Тамбов', '9001111111', 'm');
INSERT INTO PhoneBase VALUES ('Москва', '952222222', 's');
INSERT INTO PhoneBase VALUES ('Москва', '4993333333', 's');
INSERT INTO PhoneBase VALUES ('Липецк', '4742345678', 's');
INSERT INTO PhoneBase VALUES ('Тамбов', '4752756161', 's');
INSERT INTO PhoneBase VALUES ('Москва', '9109512356', 'm');
INSERT INTO PhoneBase VALUES ('Москва', '953333333', 's');
select isnull(Type,'ИТОГО') as [Type]
,sum(case City when 'Липецк' then 1 else 0 end) as [Липецк]
,sum(case City when 'Москва' then 1 else 0 end) as [Москва]
,sum(case City when 'Тамбов' then 1 else 0 end) as [Тамбов]
from PhoneBase
group by rollup (Type)
Error: near "isnull": syntax error
SQL
T-SQL. Народ, подскажите пожалуйста, почему не работает
Тип данных TEXT очень специфический, с большими ограничениями на возможные операции. В частности, при попытке сравнения выдаётся вот такое сообщение:
Вариант первый. Изменить типы данных в таблице на VARCHAR (или CHAR) подходящей длины, ну или VARCHAR(MAX), если не хочется ограничивать длину. Тогда всё работает:
Вариант второй. Оставить тип данных TEXT, но преобразовывать его в VARCHAR для обработки.
Я бы всё же рекомендовал первый вариант. Тип TEXT для больших текстов, которые не используются в операциях сравнения и группировки, грубо говоря, это пять страниц машинописного текста.
The data types text and varchar are incompatible in the equal to operator.Выхода два.
Вариант первый. Изменить типы данных в таблице на VARCHAR (или CHAR) подходящей длины, ну или VARCHAR(MAX), если не хочется ограничивать длину. Тогда всё работает:
-- create a table
CREATE TABLE PhoneBase (
City NVARCHAR(MAX) NOT NULL,
Phone VARCHAR(10) NOT NULL,
Type NCHAR(5) NOT NULL
);
-- insert some values
INSERT INTO PhoneBase VALUES
(N'Тамбов', '9001111111', 'm'),
(N'Липецк', '9051234095', 'm'),
(N'Тамбов', '9001111111', 'm'),
(N'Москва', '952222222', 's'),
(N'Москва', '4993333333', 's'),
(N'Липецк', '4742345678', 's'),
(N'Тамбов', '4752756161', 's'),
(N'Москва', '9109512356', 'm'),
(N'Москва', '953333333', 's');
SELECT isnull(Type, N'ИТОГО') As Type,
sum(CASE City WHEN N'Липецк' THEN 1 ELSE 0 END) As [Липецк],
sum(CASE City WHEN N'Москва' THEN 1 ELSE 0 END) As [Москва],
sum(CASE City WHEN N'Тамбов' THEN 1 ELSE 0 END) As [Тамбов]
FROM PhoneBase
GROUP BY rollup(Type);
Type Липецк Москва Тамбов
----- ----------- ----------- -----------
m 1 1 2
s 1 3 1
ИТОГО 2 4 3
(3 rows affected)
Type сделан NCHAR(5), чтобы влезло "ИТОГО".Вариант второй. Оставить тип данных TEXT, но преобразовывать его в VARCHAR для обработки.
-- create a table
CREATE TABLE PhoneBase (
City NTEXT NOT NULL,
Phone TEXT NOT NULL,
Type TEXT NOT NULL
);
-- insert some values
INSERT INTO PhoneBase VALUES
(N'Тамбов', '9001111111', 'm'),
(N'Липецк', '9051234095', 'm'),
(N'Тамбов', '9001111111', 'm'),
(N'Москва', '952222222', 's'),
(N'Москва', '4993333333', 's'),
(N'Липецк', '4742345678', 's'),
(N'Тамбов', '4752756161', 's'),
(N'Москва', '9109512356', 'm'),
(N'Москва', '953333333', 's');
SELECT isnull(CAST(Type AS NCHAR(5)), N'ИТОГО') As Type,
sum(CASE CAST(City AS NVARCHAR(MAX)) WHEN N'Липецк' THEN 1 ELSE 0 END) As [Липецк],
sum(CASE CAST(City AS NVARCHAR(MAX)) WHEN N'Москва' THEN 1 ELSE 0 END) As [Москва],
sum(CASE CAST(City AS NVARCHAR(MAX)) WHEN N'Тамбов' THEN 1 ELSE 0 END) As [Тамбов]
FROM PhoneBase
GROUP BY rollup(CAST(Type AS NCHAR(5)));
Type Липецк Москва Тамбов
----- ----------- ----------- -----------
m 1 1 2
s 1 3 1
ИТОГО 2 4 3
(3 rows affected)
Обрати внимание, что тип преобразования Type в SELECT и GROUP BY должен быть один и тот же.Я бы всё же рекомендовал первый вариант. Тип TEXT для больших текстов, которые не используются в операциях сравнения и группировки, грубо говоря, это пять страниц машинописного текста.
Байыш Жакыпов
Можно и скомбинировать два варианта, чтобы избавиться от явно лишнего NCHAR(5) в таблице:
Type может быть зарезервированным словом, попробуй его экранировать...
Aligarh Takhirov
заменил слово, но что то не помогло
Похожие вопросы
- SQL. Выводятся не все данные. 4 задача.
- Помогитес sql кодом, пожалуйста!
- Подскажите, есть ли такое понятие чистый SQL???
- Чем отличаются разные SQL?
- Не очень понятен синтаксис запросов SQL
- Помогите написать sql запросы
- Вопрос по SQL + Python
- Что делает кусок коды, выделенный синим? SQL
- Microsoft SQL. Процедура вывода максимального количества товаров за определенную сумму
- Вопрос по SQL. Помогите понять решение задачи