【问题标题】:SQL group the data on column values (Key, Value)SQL 对列值(键、值)上的数据进行分组
【发布时间】:2017-04-14 06:15:33
【问题描述】:

我正在尝试在 MYSQL 中对数据进行分组,但不知道该怎么做。

有一张旧表,上面有以下数据。

ID  Product Version     Memory   Color
1   1       iPhone 7    128      Black
2   2       iPhone 7    128      Black
3   3       iPhone 7    32       Gold
4   4       iPhone 7    32       Gold

SELECT count(1), Version FROM old_temp_table GROUP BY Memory, Color, 版本

组查询返回以下输出:

count   Version
2       iPhone 7
2       iPhone 7

现在:我已将此表转换为键值形式,但我希望在组中获得与旧表相同的输出。

ID  Product   Key       Value
1   1         Version   iPhone 7
2   1         Memory    128
3   1         Color     Black
4   2         Version   iPhone 7
5   2         Memory    128
6   2         Color     Black
7   3         Version   iPhone 7
8   3         Memory    32
9   3         Color     Gold
10  4         Version   iPhone 7
11  4         Memory    32
12  4         Color     Gold

我尝试了以下查询:

SELECT count(*), test_group.Key from test_group GROUP BY test_group.key, Value

此查询显示不同的输出。

Count   Key
2       Color
2       Color
2       Memory
2       Memory
4       Version

我怎样才能以最好的方式做到这一点?谢谢

更新:我不想比较两个表的数据。我只想对新表数据进行分组,但输出应该与我对旧表所做的相同。

Version:iPhone 7,Memory:128,Color:Black
Version:iPhone 7,Memory:32,Color:Gold

【问题讨论】:

  • 您已经显示了几个查询的输出,但没有一个可能是您想要的 实际 输出。你想在这里输出什么?
  • “我已将此表转换为键值形式”我想知道为什么:-(
  • @Strawberry 我正在为电子商务创建聚合器应用程序。所以我有不同类别的具有不同属性的产品。我不确定将来需要创建多少列。
  • 我正在从 10 多家商店以不同的价格和不同的属性(如记忆色)检索像 iphone 7 这样的相同产品。我正在创建将相似产品分组并找到最便宜价格的脚本。如果您有任何建议,请告诉我。我不是面向数据库的人:)

标签: mysql sql


【解决方案1】:

您可以使用子查询来取消透视表并获得与您的第一个查询相同的结果。您也可以在 SQL Fiddle 上进行测试。

SELECT
    Version, Memory, Color, COUNT(*) 
FROM (
    SELECT
        Product,
        MAX(CASE WHEN `Key`='Version' THEN `Value`
        ELSE NULL
        END) AS Version
        ,MAX(CASE
             WHEN `Key`='Memory' THEN `Value` 
             ELSE NULL 
        END) AS Memory
        ,MAX(CASE
             WHEN `Key`='Color' THEN `Value` 
             ELSE NULL 
        END) AS Color
    FROM test_group
    GROUP BY Product
) AS PivotView
GROUP BY Version, Memory, Color

这将产生这样的结果

+-----------+-------+------+-----+
|Version    |Memory |Color |COUNT|
+-----------+-------+------+-----+
|iPhone 7   |128    |Black |2    |
|iPhone 7   |32     |Gold  |2    |
+-----------+-------+------+-----+

【讨论】:

    【解决方案2】:

    如果您想透视您的数据(不是您原来的问题所暗示的),那么您可以尝试以下操作:

    SELECT
        Product,
        MAX(CASE WHEN `Key` = 'Version' THEN Value END) AS Version,
        MAX(CASE WHEN `Key` = 'Memory'  THEN Value END) AS Memory,
        MAX(CASE WHEN `Key` = 'Color'   THEN Value END) AS Color
    FROM yourTable
    GROUP BY Product
    

    请注意,KEY 是 MySQL 中的保留关键字。您不应该使用关键字来命名您的列、表等,但如果您确实使用它们,则必须使用反引号对它们进行转义。

    输出:

    演示在这里:

    Rextester

    【讨论】:

    • 对不起,我错过了一些东西。我不是在寻找旧表数据。我只想对新表数据进行分组,但它应该与我对旧表所做的方式相同,
    • @AskQuestion 你的问题对我来说不是很清楚,我以为你想取消透视,而实际上你似乎想要相反
    • 感谢您的建议。现在重命名了键列:)
    【解决方案3】:
       SELECT Count(PRODUCT) [Count], [Version],[Memory],[Color]
        FROM (
        SELECT [Key], PRODUCT, Value
        FROM #test_group) up
        PIVOT (min(Value) FOR [Key] IN ([Version],[Memory],[Color])) AS pvt
        GROUP BY [Version],[Memory],[Color]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 2017-07-05
      • 2012-12-16
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多