如何为每行添加具有相同值的列?

时间:2011-07-29 13:42:08

标签: sql sql-server group-by union

我被要求对我们的数据库进行搜索,并解释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 个答案:

答案 0 :(得分:5)

这应该有效。试试单引号。

SQL使用单引号来表示字符串文本。似乎它可以解释双引号,但你有它。

答案 1 :(得分:5)

以下应该给你一个很好的起点我想:

;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

答案 2 :(得分:1)

更改您的语音标记。 E.g:

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)

答案 3 :(得分:1)

不确定我是否正确,但如果你想在列中得到结果,你可以这样做:

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