SQL选择多列中的类别计数

时间:2016-01-03 14:36:18

标签: mysql sql

我在这些列的表格中有一个数据结构

ID | Title | Category_level_1 | Category_level_2 | Category_level_3
1 | offer 1 | Browns          | Greens           | White   
2 | offer 1 | Browns          | White            |   
3 | offer 2 | Greens          | Yellow           |     
4 | offer 3 | Browns          | Greens           |      
5 | offer 4 | Browns          | Yellow           | White    

如果无法更改表格结构,我需要“计算3列中每个类别的优惠数量”

还有提供日期范围的列,以限制当前的列,但我想首先计算出查询。

我需要获取所有类别的列表,然后针对它们提出要约。

优惠可以不止一次出现在桌面上。

据我所知,首先使用UNION进行临时表。

CREATE TEMPORARY TABLE IF NOT EXISTS Cats AS 
( SELECT DISTINCT(opt) FROM (
    SELECT Category_level_1 AS opt FROM a_table
    UNION
    SELECT Category_level_2 AS opt FROM a_table
    UNION
    SELECT Category_level_3 AS opt FROM a_table
  ) AS Temp 
) ;


  SELECT 
    Cats.opt AS "Joint Cat",
    (
        SELECT count(*)
        FROM a_table 
        WHERE a_table.`Category_level_1` = Cats.opt
        OR a_table.`Category_level_2` = Cats.opt
        OR a_table.`Category_level_3` = Cats.opt
        GROUP BY a_table.Title
    ) As Total
    FROM Cats 
        WHERE Category_level_1 != '' 
        ORDER BY Category_level_1 ASC;

ISSUE: a)所以工会运作良好,我得到了我的价值观。 DONE b)Total subselect虽然没有正确分组。 我只想要计算返回的所有行,但是它的分组是行标题的计数而不是所有行。

因此,试图弄清楚如何解决这个问题应该有效,而SQL可能与答案完全不同:

   Joint Category  | Total Count of offers
   Browns          | 3   
   White           | 3  
   Greens          | 2  
   Yellow          | 2 

2 个答案:

答案 0 :(得分:1)

<强>计划

  
      
  • 将所有不同类别联合起来,别名为Option Explicit Private Sub Command1_Click() Form2.Text1.Text = "Parth" End Sub Private Sub Command2_Click() Form2.Show vbModal, Me 'Since we are the owner, Form2 unloads when we do. End Sub
  •   
  • 聚合计数超过Option Explicit Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If UnloadMode = vbFormControlMenu Then Cancel = True Hide End If End Sub (其中不为空或空白 - 如果这些字段为空或空白,则无法从渲染中清除..)   按Joint Category
  • 分组   

<强>查询

Joint Category

<强>输出

Joint Category

<强> sqlfiddle

答案 1 :(得分:1)

您的结果有点令人困惑。 。 。我不知道为什么棕色和白色都有3个数。我认为你在计算水平和类别的组合。

我倾向于使用union all来解决此问题,然后使用count()count(distinct),具体取决于计数逻辑的实际情况。对于级别和类别的组合:

SELECT cat, COUNT(DISTINCT level, title) as numtitles
FROM ((SELECT title, 1 as level, category_level1 as cat FROM a_table) union all
      (SELECT title, 2 as level, category_level2 as cat FROM a_table) union all
      (SELECT title, 3 as level, category_level3 as cat FROM a_table)
     ) tc
WHERE cat is not null
GROUP BY cat;

您可以在每个子查询中包含日期列,然后在WHERE子句中包含条件。