SQL Server: количество символов в играх. Sql количество символов


sql - SQL Server: количество символов в играх

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

SELECT Num_Conc, datasort, jackpot, premio, Symbol, SymValue FROM Chaves UNPIVOT ( SymValue FOR [Symbol] IN ([s1], [s2], [s3], [s4], [s5], [s6], [s7], [s8], [s9], [s10], [s11], [s12], [s13]) ) AS UPIV

"Непривязанные" строки выглядят следующим образом:

| Num_Conc | datasort | jackpot | premio | Symbol | SymValue | |----------|------------|---------|--------|--------|----------| | 1 | 2016-01-03 | true | 0 | s1 | 2 | | 1 | 2016-01-03 | true | 0 | s2 | X | | 1 | 2016-01-03 | true | 0 | s3 | X | | 1 | 2016-01-03 | true | 0 | s4 | X | | 1 | 2016-01-03 | true | 0 | s5 | 1 |

Как только данные находятся в этой форме, тривиальной задачей является их подсчет с использованием предложения GROUP BY и функции COUNT().

SELECT Num_Conc, datasort, jackpot, premio , count(case when U.SymValue = '1' then 1 end) as [total1-counts] , count(case when U.SymValue = 'X' then 1 end) as [totalx-counts] , count(case when U.SymValue = '2' then 1 end) as [total2-counts] FROM ( SELECT Num_Conc, datasort, jackpot, premio, Symbol, SymValue FROM Chaves UNPIVOT ( SymValue FOR [Symbol] IN ([s1], [s2], [s3], [s4], [s5], [s6], [s7], [s8], [s9], [s10], [s11], [s12], [s13]) ) AS UPIV ) AS U GROUP BY Num_Conc, datasort, jackpot, premio ;

и результат:

| Num_Conc | datasort | jackpot | premio | total1-counts | totalx-counts | total2-counts | |----------|------------|---------|--------|---------------|---------------|---------------| | 1 | 2016-01-03 | true | 0 | 2 | 6 | 5 | | 2 | 2016-01-10 | true | 0 | 7 | 4 | 2 |

Существует альтернативный синтаксис с использованием CROSS APPLY вместо UNPIVOT, который дает тот же результат, что и выше:

SELECT Num_Conc, datasort, jackpot, premio , count(case when U.SymValue = '1' then 1 end) as [total1-counts] , count(case when U.SymValue = 'X' then 1 end) as [totalx-counts] , count(case when U.SymValue = '2' then 1 end) as [total2-counts] FROM Chaves CROSS APPLY ( values ('s1' ,s1 ) , ('s2' ,s2 ) , ('s3' ,s3 ) , ('s4' ,s4 ) , ('s5' ,s5 ) , ('s6' ,s6 ) , ('s7' ,s7 ) , ('s8' ,s8 ) , ('s9' ,s9 ) , ('s10' ,s10 ) , ('s11' ,s11 ) , ('s12' ,s12 ) , ('s13' ,s13 ) , ('s14' ,s14 ) ) as U (symname,symvalue) GROUP BY Num_Conc, datasort, jackpot, premio ;

Вероятно, вы обнаружите множество обстоятельств, когда шаблон с поворотными таблицами усложняет анализ данных, поэтому с помощью непринятого подхода к нормализации данных сначала может быть что-то, что вам нужно будет делать часто. Если это верно, обратите внимание, что CROSS APPLY позволяет включить [s14] в "неавторизованные" строки, но UNPIVOT operator (верхний запрос) НЕ легко справляется с этим, потому что [s14] является varchar (5), в то время как другие столбцы являются char (1), поэтому потребуются преобразования типов. Это упростит использование CROSS APPLY, если вам нужно [s14] "не распознано".

qaru.site

Выборка определенного количества символов в SQL запросе

Форум: "Начинающим";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2006.08.13;Скачать: [xml.tar.bz2];

Вниз

Выборка определенного количества символов в SQL запросе 
Константин_   (2006-07-26 10:30) [0]

Как выбрать определенное количество символов в sql запросе начиная с конца поля, например "123456" > "3456"С уважением.

ЮЮ ©   (2006-07-26 10:40) [1]

В MS SQL: RIGHT(<строка>, <количество>)У других серверов, наверняка, что-то найдется подобное.В стандарте, имхо, такого нет. Лишь SUBSTRING, т.е. подйдет, если количество симолов в значениях поля одинаковое и известное

Константин_   (2006-07-26 11:03) [2]

select cast(dogovor as char(3)) from pred.dbf where cast(dogovor as int)>1000В таком запросе получается выборка 3 символов с начала строки, а может его можно как то изменить?

Desdechado ©   (2006-07-26 11:31) [3]

Видимо, намек указать СУБД не понят.

ЮЮ ©   (2006-07-26 11:35) [4]

БД какая?

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

С начал строки, естественно, проблем нет, коль есть Substring()

Константин_   (2006-07-26 11:47) [5]

выборка производиться из талицы DBase IV при помощи компонента Query

ЮЮ ©   (2006-07-26 11:48) [6]

SELECT dogovor from pred.dbf where cast(dogovor as int) < 10000         /* 1 - 4х значные*.UNION ALLSELECT Substring(dogovor from 2 for 4) FROM pred.dbf  where cast(dogovor as int) BETWEEN 10000 AND 99999    /* для 5-начных*/UNION ALL... и так далее

З.Ы. зачем такие важные последнии символа слис со столь маловажными первыми в одом поле? Раздели, пока не поздно

ЮЮ ©   (2006-07-26 11:50) [7]

З.Ы. Как будешь различать договора 123456 и 213456 после такого запроса?

Константин_   (2006-07-26 11:52) [8]

Работа ведеться с водомерным счетчиком, а у него есть такая особенность перекручиваться... очень не хорошая.Спасибо за помощь.

Константин_   (2006-07-26 11:53) [9]

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

ЮЮ ©   (2006-07-26 12:01) [10]

> а у него есть такая особенность перекручиваться... очень > не хорошая.

У него наверное всего 4 числа то и есть и для него естественно "перекручиваться", а вот откуда в базе появляются неестественные 5-е цифры?

Константин_   (2006-07-26 12:04) [11]

начальные показания 9985 последние показания 0010 в баз 10010

ЮЮ ©   (2006-07-26 12:20) [12]

Ну и откуда эта 1 в базе?

следующее показание будет 0100, а у тебя уже предыдущее 10010. Опять перекрутка нужна? Или пририсовка?

Может лучше оставлять как есть 0010?А при расчетах учитывать возможность "перекрутки"

Константин_   (2006-07-26 12:26) [13]

Можно было бы оставить... но прога уже в эксплуатации... недоглядел, теперь мучаюсь

Форум: "Начинающим";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2006.08.13;Скачать: [xml.tar.bz2];

Наверх

Память: 0.74 MBВремя: 0.104 c

www.delphimaster.net

количество символов в играх MS SQL Server

Попробуйте этот трюк

SELECT *, (SELECT Count(v) FROM (VALUES (s1),(s2),(s3),(s4),...) AS value(v) WHERE v IN ( '2', '1', 'X' )) AS TOTAL_COUNT FROM chaves

Чтобы получить индивидуальный счет, используйте

;WITH cte AS (SELECT *, (SELECT Count(v) FROM (VALUES (s1),(s2),(s3),(s4),..) AS value(v) WHERE v = '1') AS count_1, (SELECT Count(v) FROM (VALUES (s1),(s2),(s3),(s4),..) AS value(v) WHERE v = 'x') AS count_x, (SELECT Count(v) FROM (VALUES (s1),(s2),(s3),(s4),..) AS value(v) WHERE v = '2') AS count_2 FROM chaves) SELECT count_1 + count_x + count_2 AS TOTAL_COUNT FROM cte;

SQL FIDDLE DEMO

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

SELECT Num_Conc, datasort, jackpot, premio, Symbol, SymValue FROM Chaves UNPIVOT ( SymValue FOR [Symbol] IN ([s1], [s2], [s3], [s4], [s5], [s6], [s7], [s8], [s9], [s10], [s11], [s12], [s13]) ) AS UPIV

«Непривязанные» строки выглядят следующим образом:

| Num_Conc | datasort | jackpot | premio | Symbol | SymValue | |----------|------------|---------|--------|--------|----------| | 1 | 2016-01-03 | true | 0 | s1 | 2 | | 1 | 2016-01-03 | true | 0 | s2 | X | | 1 | 2016-01-03 | true | 0 | s3 | X | | 1 | 2016-01-03 | true | 0 | s4 | X | | 1 | 2016-01-03 | true | 0 | s5 | 1 |

Как только данные находятся в этой форме, тривиальной задачей является их подсчет с использованием предложения GROUP BY и функции COUNT ().

SELECT Num_Conc, datasort, jackpot, premio , count(case when U.SymValue = '1' then 1 end) as [total1-counts] , count(case when U.SymValue = 'X' then 1 end) as [totalx-counts] , count(case when U.SymValue = '2' then 1 end) as [total2-counts] FROM ( SELECT Num_Conc, datasort, jackpot, premio, Symbol, SymValue FROM Chaves UNPIVOT ( SymValue FOR [Symbol] IN ([s1], [s2], [s3], [s4], [s5], [s6], [s7], [s8], [s9], [s10], [s11], [s12], [s13]) ) AS UPIV ) AS U GROUP BY Num_Conc, datasort, jackpot, premio ;

и результат:

| Num_Conc | datasort | jackpot | premio | total1-counts | totalx-counts | total2-counts | |----------|------------|---------|--------|---------------|---------------|---------------| | 1 | 2016-01-03 | true | 0 | 2 | 6 | 5 | | 2 | 2016-01-10 | true | 0 | 7 | 4 | 2 |

Существует альтернативный синтаксис с использованием CROSS APPLY вместо UNPIVOT, который дает тот же результат, что и выше:

SELECT Num_Conc, datasort, jackpot, premio , count(case when U.SymValue = '1' then 1 end) as [total1-counts] , count(case when U.SymValue = 'X' then 1 end) as [totalx-counts] , count(case when U.SymValue = '2' then 1 end) as [total2-counts] FROM Chaves CROSS APPLY ( values ('s1' ,s1 ) , ('s2' ,s2 ) , ('s3' ,s3 ) , ('s4' ,s4 ) , ('s5' ,s5 ) , ('s6' ,s6 ) , ('s7' ,s7 ) , ('s8' ,s8 ) , ('s9' ,s9 ) , ('s10' ,s10 ) , ('s11' ,s11 ) , ('s12' ,s12 ) , ('s13' ,s13 ) , ('s14' ,s14 ) ) as U (symname,symvalue) GROUP BY Num_Conc, datasort, jackpot, premio ;

Вероятно, вы обнаружите множество обстоятельств, когда шаблон с поворотными таблицами усложняет анализ данных, поэтому с помощью непринятого подхода к нормализации данных сначала может быть что-то, что вам нужно будет делать часто. Если это верно, обратите внимание, что CROSS APPLY позволяет включить [s14] в «неавторизованные» строки, но UNPIVOT operator (верхний запрос) НЕ легко справляется с этим, потому что [s14] является varchar (5), в то время как другие столбцы являются char (1), поэтому потребуются преобразования типов. Это упростит использование CROSS APPLY, если вам нужно [s14] «не распознано».

Трюк состоит в том, чтобы конкатрировать все 13 столбцов (совпадений?), А затем сравнить длину 1 – исходную строку и 2- строку с заменой (или заменой) (concat (s1, s2 ….), 'X', ' ') и снова для «1» и «2»: select *, length(concat(s1,s2...s13)) - length(replace(concat(s1,s2...s13),'1','')) as 'ones' (and again for 'x' and '2's) from tablename

select *, concat(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13) as 'full_games_string', length(concat(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13))-length(replace(concat(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13),'X','')) as 'Xs', length(concat(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13))-length(replace(concat(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13),'1','')) as '1s', length(concat(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13))-length(replace(concat(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13),'2','')) as '2s' from Chaves

нет необходимости в двойных запросах 🙂

sqlserver.bilee.com