【问题标题】:SQL query - Filling column depending onSQL 查询 - 填充列取决于
【发布时间】:2019-07-12 15:43:41
【问题描述】:

我的数据库逐行报告了几个装有软件(仅特定软件)的终端。这是一个例子:

HOSTNAME | MAC ADDRESS | IP ADDRESS | SOFTWARE NAME
---------------------------------------------------
PC-AAA   | 94-da-r2-12 | xx.xx.xx.xx| TeamViewer
PC-AAA   | 94-da-r2-12 | xx.xx.xx.xx| Google Chrome
PC-BBB   | 94-da-s4-16 | xx.xx.xx.xx| TeamViewer
PC-BBB   | 94-da-s4-16 | xx.xx.xx.xx| Google Chrome 
etc.

如何构建查询以便为每个软件提供一个列,如下例所示?

HOSTNAME | MAC ADDRESS | IP ADDRESS | TeamViewer | Google Chrome
----------------------------------------------------------------
PC-AAA   | 94-da-r2-12 | xx.xx.xx.xx| TeamViewer | 
PC-AAA   | 94-da-r2-12 | xx.xx.xx.xx|            | Google Chrome
PC-BBB   | 94-da-s4-16 | xx.xx.xx.xx| TeamViewer |
PC-BBB   | 94-da-s4-16 | xx.xx.xx.xx|            | Google Chrome

【问题讨论】:

  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签postgresqloracledb2sql-server、...

标签: sql pivot crosstab


【解决方案1】:

这是转置 SQL 查询的方法... SQL server支持pivot,MySQL等不支持

如果有固定数量的软件,CASE WHENGROUP BY 可以工作

SELECT
HOSTNAME, MAC ADDRESS, IP_ADDRESS, 
CASE
WHEN (SOFTWARE_NAME = 'TeamViewer') THen 'TeamViewer'
ELSE ''
END AS TeamViewer
CASE
WHEN (SOFTWARE_NAME = 'GoogleChrome') THen 'GoogleChrome'
ELSE ''
END AS GoogleChrome

FROM
log_table
GROUP BY
HOSTNAME, MAC ADDRESS, IP_ADDRESS

【讨论】:

    【解决方案2】:

    使用case 表达式:

    SELECT HOSTNAME, MAC_ADDRESS, IP_ADDRESS,
           (CASE WHEN SOFTWARE_NAME = 'TeamViewer' THEN SOFTWARE_NAME END) as TeamViewer,
           (CASE WHEN SOFTWARE_NAME = 'GoogleChrome' THEN SOFTWARE_NAME END) as GoogleChrome
    FROM log_table;
    

    如果您希望每个主机和地址有一行,请使用聚合:

    SELECT HOSTNAME, MAC_ADDRESS, IP_ADDRESS,
           MAX(CASE WHEN SOFTWARE_NAME = 'TeamViewer' THEN SOFTWARE_NAME END) as TeamViewer,
           MAX(CASE WHEN SOFTWARE_NAME = 'GoogleChrome' THEN SOFTWARE_NAME END) as GoogleChrome
    FROM log_table
    GROUP BY HOSTNAME, MAC_ADDRESS, IP_ADDRESS;
    

    这不是您指定的输出,但它似乎更有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多