Как добавить столбец с одинаковым значением для каждой строки? - PullRequest
3 голосов
/ 29 июля 2011

Меня попросили выполнить поиск по нашей базе данных и объяснить количество клиентов в 5 различных возрастных диапазонах. Я знаю, что могу выполнить один и тот же запрос пять раз. Тем не менее, я надеялся создать один запрос, который бы выполнял всю работу.

Насколько мне известно, мне нужно выполнить 5 запросов, а затем использовать "UNION" для соединения различных запросов.

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

SQL, который я придумал, был:

SELECT     COUNT(CLIENT_ID) AS Client_Count, "0 to 19" AS [Age Group]
FROM         dbo.CLIENTS
WHERE     (DATEDIFF(year, DOB, GETDATE()) BETWEEN 0 AND 19)

Хотя я надеялся, что это сработает, он ожидает от 0 до 19 столбца. Откуда мне знать, что я просто пытаюсь передать ему фиксированное значение?

Как только я заставлю это работать, они захотят, чтобы я указывал значения в процентах от общего числа. Любая помощь приветствуется.

Ответы [ 4 ]

5 голосов
/ 29 июля 2011

Следующее должно дать вам хорошую отправную точку, я думаю:

;with AgeRanges(Low, High) as (
    select 0, 19
    union select 20, 39
    union select 40, 59
    union select 60, 79
    union select 80, 1000
)

select
    count(CLIENT_ID) as Client_Count,
    convert(varchar, Low) + ' to ' + convert(varchar, High) as [Age Group]
from
    dbo.CLIENTS
    inner join AgeRanges
        on  DATEDIFF(year, DOB, getdate()) BETWEEN Low and High
5 голосов
/ 29 июля 2011

Это должно работать.Попробуйте использовать одинарные кавычки.

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

1 голос
/ 29 июля 2011

Не уверен, правильно ли я понял, но если вам нужны результаты в столбцах, вы можете сделать что-то вроде этого:

SELECT
  [0 to 19]  = COUNT(CASE WHEN DATEDIFF(year, DOB, GETDATE()) BETWEEN  0 AND 19 THEN 1 END),
  [20 to 39] = COUNT(CASE WHEN DATEDIFF(year, DOB, GETDATE()) BETWEEN 20 AND 39 THEN 1 END),
  …
FROM dbo.Clients
1 голос
/ 29 июля 2011

Измените свои речевые метки. Например:

SELECT '0 to 19' AS [Age Group]

В полном объеме:

SELECT     COUNT(CLIENT_ID) AS Client_Count, '0 to 19' AS [Age Group]
FROM         dbo.CLIENTS
WHERE     (DATEDIFF(year, DOB, GETDATE()) BETWEEN 0 AND 19)
...