【问题标题】:SQL - Counting column categoriesSQL - 计算列类别
【发布时间】:2018-12-11 22:26:34
【问题描述】:

我是 SQL 新手,但我正在尝试创建一个报告,我可以在其中计算学生购买的食物,并按种族/民族和每年的食物选择进行分类。

例如:

         2012                                          2013
Student Vegetarian     Meat           Unknown          Vegetarian     Meat           Unknown
---------------------------------------------------------------------------
Black    5 Purchases   4 Purchases      3 Purchases      5 Purchases   etc
White    4 Purchases   3 Purchases      3 Purchases      etc           etc
Asian    4 Purchases   1 Purchases      6 Purchases      etc           etc

虽然我能够在一个专栏中获得比赛,但我对不同食物类别的计数感到迷茫。我只知道 pur_type 被归类为“Veg”、“Me”和“Ukt”,分别代表 Vegetarian、Meat 和未知购买。

这是我尝试做的:

select 
     DATEPART(YYYY,pur_date) AS Year
    ,count (*) Citations
    , race
    , sex
    , ethnicity
    , GETDATE() as YTD
    ,COUNT(CASE WHEN pur_type = 'Veg' THEN 'Vegetarian' 
    WHEN pur_type = 'Me' THEN 'Meat' 
    WHEN pur_type  = 'UKt' THEN 'Unknown'  

         ELSE ''

         End as "Type"

, CASE 
    WHEN race='W' and sex='M' and ethnicity <> 'H' THEN 'Caucasian(Male)' 
    WHEN race='W' and sex='F' and ethnicity <> 'H' THEN 'Caucasian(Female)' 
    WHEN race='B' and sex='M' and ethnicity <> 'H' THEN 'African-American(Male)' 
    WHEN race='B' and sex='F' and ethnicity <> 'H' THEN 'African-American(Female)' 
    --WHEN race='A' and sex='M' and ethnicity <> 'H' THEN 'Pacific Islander(Male)' 
    --WHEN race='A' and sex='F' and ethnicity <> 'H' THEN 'Pacific Islander(Female)' 
    WHEN race='A' and sex='M' and ethnicity <> 'H' THEN 'Asian(Male)'  
    WHEN race='A' and sex='F' and ethnicity <> 'H' THEN 'Asian(Female)' 



    ELSE '' 
END as 'Race' 




from purchase
join purcharge
on purchase.purchaseid = purcharge.purchaseid
where pur_date between @startDate and  dateadd(DD, +1,  GETDATE())
and pur_type in ('Veg', 'Me', 'UKt')
GROUP BY DATEPART(YYYY,pur_date), race, sex, ethnicity , pur_type
ORDER BY 'Year','Race/Sex'

寻求指导。我想也许一个子查询会起作用,也许更多的案例陈述会起作用,但我无法计算每个种族的学生购买了多少食品类别。

另外,我正在尝试在 SSRS 报告中获取这些结果,因此它在 SQL 查询中可能看起来略有不同。

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 微软 SQL 服务器
  • 然后用SQL Server标签标记你的问题。 SQL 只是多个 dbms 供应商使用的一种语言。
  • 好的,我已经更正了。
  • @Eric Dude,这是一个 SQL 查询问题。标记它 Sql Server 只是告诉我们平台。

标签: sql sql-server reporting-services


【解决方案1】:

您可以查看PIVOT 语句,但如果是我,我会做更多的 CASE...WHEN 和 GROUP BY。

所以,而不是

COUNT(CASE WHEN pur_type = 'Veg' THEN 'Vegetarian' (etc) AS Type

我愿意

SUM(CASE WHEN pur_type = 'Veg' THEN 1 ELSE 0) AS Vegetarian

等等。

【讨论】:

    【解决方案2】:

    这并不是创建报告的最佳方式,但如果您需要使用 SQL(而不是使用另一层代码从一堆数据子集生成报告),您可以使用子查询。没有看到表结构,很难写查询,但可能是这样的:

    Select
        race
        , (select count(*) from purchase where pur_type = 'Veg' and race = race) as Vegetables
        , (select count(*) from purchase where pur_type = 'Me' and race = race) as Meat
        , (select count(*) from purchase where pur_type = 'UKt' and race = race) as Unknown
    From purchase
    

    就像我说的,这并不理想,但它会为您提供不同的数据子集。

    【讨论】:

    • 我将如何在我的场景中使用它,我已经专门提供案例陈述,结合种族性别和种族?我想为 SSRS 报告创建数据字段,以便我可以直接选择它们来获取数据。
    • 出于某种原因,count(*) 并未汇总食品类别购买的所有实例。将结果显示为 0
    【解决方案3】:

    我不知道您的数据是什么样的,也没有时间构建示例数据,但我认为您实际上只是有一两个错字..

    SELECT 
         DATEPART(YYYY,pur_date) AS [Year]
        ,count (*) Citations
        , race
        , sex
        , ethnicity
        , GETDATE() as YTD
        , COUNT(*) AS [PurchaseCount]
        , CASE 
            WHEN pur_type = 'Veg' THEN 'Vegetarian'
            WHEN pur_type = 'Me' THEN 'Meat'
            WHEN pur_type  = 'UKt' THEN 'Unknown'
            ELSE ''
        End as [Type]
    , CASE 
        WHEN race='W' and sex='M' and ethnicity <> 'H' THEN 'Caucasian(Male)' 
        WHEN race='W' and sex='F' and ethnicity <> 'H' THEN 'Caucasian(Female)' 
        WHEN race='B' and sex='M' and ethnicity <> 'H' THEN 'African-American(Male)' 
        WHEN race='B' and sex='F' and ethnicity <> 'H' THEN 'African-American(Female)' 
        --WHEN race='A' and sex='M' and ethnicity <> 'H' THEN 'Pacific Islander(Male)' 
        --WHEN race='A' and sex='F' and ethnicity <> 'H' THEN 'Pacific Islander(Female)' 
        WHEN race='A' and sex='M' and ethnicity <> 'H' THEN 'Asian(Male)'  
        WHEN race='A' and sex='F' and ethnicity <> 'H' THEN 'Asian(Female)' 
        ELSE '' 
    END as [Race] 
    FROM purchase
    JOIN purcharge
        ON purchase.purchaseid = purcharge.purchaseid
    WHERE pur_date BETWEEN @startDate AND dateadd(DD, +1,  GETDATE())
        AND pur_type in ('Veg', 'Me', 'UKt')
    GROUP BY DATEPART(YYYY,pur_date), race, sex, ethnicity , pur_type
    ORDER BY [Year],[Race], [Type]
    

    这不会准确给出您所要求的内容,因为它在您的 [Race] 案例陈述中包括种族和性别,但也许这就是您真正想要的,我不知道...

    无论如何,我真正改变的只是 count(*) as [PurchaseCount] 、下一行的 CASE 语句和 GROUP BY 子句。 COUNT(*) 只会为您提供属于您的 GROUP BY 子句的记录数。在这种情况下,每个 [Year]、[Race] 和 [Type] 的记录计数

    【讨论】:

    • 艾伦,谢谢。此查询没有提供 SSRS 报告所需的三个字段。我希望将 Veg、Meat 和 Unknown 作为可以显示数据的变量/字段。理论上,它应该计算一个学生在给定年份购买的所有素食、平均和未知食品类别的购买事件。我尝试了另一个人在这里发布的答案之一,它确实为reort创建了这些字段/类别,但不计算每个的总数。 , (select count(*) from purchase where pur_type = 'Veg' and race = race) 作为蔬菜
    • 您的 SSRS 报告将为您完成这项工作。如果您只需要原始设计,那么您只需要包含种族、类型、年份和计数的结果。在 SSRS 中,只需将以上内容添加为您的数据集。在报表中添加一个矩阵,将行组设置为 Race 并添加列组,一个用于年份,一个用于 Type,最后将计数列放入数据值区域。 SSRS 基本上会为您完成其余的工作,您的 SQL 代码不需要执行您尝试执行的数据透视类型操作。现在是午夜,但如果我有机会,我会在早上发布一个样本。
    • 我在 SSR 中运行它,但没有运气。比你的帮助!请休息一下!
    • 艾伦,如果你能帮助我,我将不胜感激。
    • 今晚我会尝试看看,但没有承诺!
    猜你喜欢
    • 2019-10-24
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多