отображать несколько значений в одном столбце в одной строке - PullRequest
0 голосов
/ 11 августа 2011

У меня есть таблица ниже с именем города, именем оператора и префиксом: Столбец префикса содержит несколько значений с диапазоном этого.

Cityname operatorname     prefix
-------- ---------------- -----------------------------------------------------------
Kolkata  Unitech          90620-90629 82960-82969
Kolkata  Datacom          90730-90739
Kolkata  BSNL             94330-94339 94320-94325
Kolkata  Loop             91100-91109
Kolkata  Reliance Telecom 98830-98839 96810-96819 88200-88209
Mumbai   BPL Mobile       98210-98219 96640-96649 97730-97739 98700-98709 80820-80829
Mumbai   Bharti Airtel    98670-98679 98920-98929 99670-99674 99870-99878 90040-90049

но я хочу, чтобы каждый префикс в новом ряду также был в диапазоне, например, например. 91100-91109 означает диапазон от 91100,91101 91102 91103 ..... до 91109 ..

Белво - это выход, который я хочу получить, например. Калькутта Unitech Wireless

Cityname  operatorname      prefix 
--------  ----------------  ------
Kolkata   Unitech Wireless  90620
Kolkata   Unitech Wireless  90621
Kolkata   Unitech Wireless  90622
Kolkata   Unitech Wireless  90623
.....
.....
.....
Kolkata   Unitech Wireless  90629
Kolkata   Unitech Wireless  82960
Kolkata   Unitech Wireless  82961
Kolkata   Unitech Wireless  82962
.....
.....
.....
Kolkata   Unitech Wireless  82969

затем следуют решения для kolkata datacom и так далее ...

Пожалуйста, помогите записать запрос в Sql server 2008

Пожалуйста, предложите как можно раньше.

1 Ответ

3 голосов
/ 11 августа 2011

Я вижу, что это решается в два логических шага:

  1. Разбить каждый список диапазонов префиксов на ряд рядов префиксов, то есть каждую строку, например

    city operator prefix-range1 prefix-range2 prefix-range3 …

    разбивается на

    city operator prefix-range1
    city operator prefix-range2
    city operator prefix-range3
    city

  2. Развернуть каждый элемент диапазона префиксов, например

    city operator <em>Prefix<sub>1</sub>-Prefix<sub>N</sub></em>

    впоследовательность строк, подобная этой:

    city operator <em>Prefix<sub>1</sub></em>
    city operator <em>Prefix<sub>2</sub></em>
    city operator <em>…</em>
    city operator <em>Prefix<sub>N-1</sub></em>
    city operator <em>Prefix<sub>N</sub></em>

Ниже приведена попытка реализации указанногологика:

WITH data (Cityname, operatorname, prefix) AS (  /* this is just a sample data definition */
  SELECT 'Kolkata', 'Unitech         ', '90620-90629 82960-82969' UNION ALL
  SELECT 'Kolkata', 'Datacom         ', '90730-90739' UNION ALL
  SELECT 'Kolkata', 'BSNL            ', '94330-94339 94320-94325' UNION ALL
  SELECT 'Kolkata', 'Loop            ', '91100-91109' UNION ALL
  SELECT 'Kolkata', 'Reliance Telecom', '98830-98839 96810-96819 88200-88209' UNION ALL
  SELECT 'Mumbai ', 'BPL Mobile      ', '98210-98219 96640-96649 97730-97739 98700-98709 80820-80829' UNION ALL
  SELECT 'Mumbai ', 'Bharti Airtel   ', '98670-98679 98920-98929 99670-99674 99870-99878 90040-90049'
),
SplitGroups AS (  /* this is where the list is split into separate ranges */
  SELECT
    d.Cityname, d.operatorname,
    StartPrefix = CAST(LEFT (x.PrefixGroup, 5) AS int),
    EndPrefix   = CAST(RIGHT(x.PrefixGroup, 5) AS int)
  FROM (
    SELECT
      Cityname, operatorname,
      prefixlist = CAST('<i>'+REPLACE(prefix, ' ', '</i><i>')+'</i>' AS xml)
    FROM data
  ) d
  CROSS APPLY (
    SELECT
      i.value('.', 'varchar(max)') AS PrefixGroup
    FROM d.prefixlist.nodes('i') x (i)
  ) x
)
SELECT  /* the final SELECT expands the ranges into single prefix rows */
  g.Cityname, g.operatorname,
  prefix = g.StartPrefix + v.number
FROM SplitGroups g
  INNER JOIN master..spt_values v on v.type = 'P'
    AND v.number BETWEEN 0 AND g.EndPrefix - g.StartPrefix

Он работает в моем SQL Server 2008 R2, как и ожидалось, но были сделаны следующие предположения:

  1. Все исходные значения prefix отформатированы единообразно и согласованно:

    • диапазоны разделены одним пробелом;

    • нет пробелов, кроме тех, которые разделяют диапазоны;

    • каждый диапазон представляет собой целое число, за которым следует дефис (-), за которым следует целое число.

  2. Каждое целое число (префикс)содержит ровно 5 цифр.

  3. Каждый диапазон охватывает не более 2048 префиксов, то есть разница между конечным префиксом и начальным префиксом никогда не превышает 2047. Это ограничение master..spt_valuesТаблица.Вы можете заменить его своей собственной таблицей номеров, если вам нужна поддержка для более чем 2048 префиксов в диапазоне.


Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...