【问题标题】:how to show row data in column?如何在列中显示行数据?
【发布时间】:2018-09-22 18:08:59
【问题描述】:

我是 T-SQL 的初学者,我遇到了一个问题,即每天都必须生成一行,以及一个包含以下列“DATE”、“PRICE”、“CATEGORY 1”、“CATEGORY 2”的表”。输出必须创建列(“CATEGORY 1”、“CATEGORY 2”的组合)并显示价格。如果价格不可用,则应显示 null。以下是我需要生成的结果

TABLE
-----------------------------------------------
DATE      | PRICE    | CATEGORY 1 | CATEGORY 2
-----------------------------------------------
20171215    285            Books      Non-Fiction
20171212    390            Gaming     PlayStation 4
20171213    40             Antiques   collectables

输出

DATE       | Books- Non-Fiction | Gaming - PlayStation 4 | Antiques - collectables  
20171212          NULL                     390                   NULL
20171213          NULL                     NULL                  40
20171215          285                      NULL                  NULL

有可能实现吗?

【问题讨论】:

  • 你的 DBMS 是什么?
  • 我正在使用 MSSQL

标签: sql sql-server tsql case-when


【解决方案1】:

你可以尝试使用条件聚合函数

CREATE TABLE T(
   DATE INT,
   PRICE INT,
   [CATEGORY 1] VARCHAR(50),
   [CATEGORY 2] VARCHAR(50)

);

INSERT INTO T VALUES (20171215,285,'Books','Non-Fiction');
INSERT INTO T VALUES (20171212,390,'Gaming','PlayStation 4');
INSERT INTO T VALUES (20171213,40 ,'Antiques','collectables');

查询 1

SELECT DATE,
    SUM(CASE WHEN [CATEGORY 1] = 'Books' and [CATEGORY 2] = 'Non-Fiction'  THEN PRICE end) 'Books- Non-Fiction ',
    SUM(CASE WHEN [CATEGORY 1] = 'Gaming' and [CATEGORY 2] = 'PlayStation 4'  THEN PRICE  end) 'Gaming - PlayStation 4',
    SUM(CASE WHEN [CATEGORY 1] = 'Antiques' and [CATEGORY 2] = 'collectables'  THEN PRICE  end) 'Antiques - collectables'    
FROM T
GROUP BY DATE
ORDER BY DATE

Results

|     DATE | Books- Non-Fiction  | Gaming - PlayStation 4 | Antiques - collectables |
|----------|---------------------|------------------------|-------------------------|
| 20171212 |              (null) |                    390 |                  (null) |
| 20171213 |              (null) |                 (null) |                      40 |
| 20171215 |                 285 |                 (null) |                  (null) |

【讨论】:

  • 有没有办法每天自动生成单行?
  • auto generate single row every day 是什么意思?有例子吗?
  • @D-Shih 如果在同一日期有多个类别的条目,您最终会得到另一行,因为结果没有分组。 Esperento57 在另一个答案中解决了这个问题。
【解决方案2】:

试试这个:

SELECT DATE,
    SUM(CASE WHEN [CATEGORY 1] = 'Books' and [CATEGORY 2] = 'Non-Fiction'  THEN PRICE ELSE null end) 'Books- Non-Fiction',
    SUM(CASE WHEN [CATEGORY 1] = 'Gaming' and [CATEGORY 2] = 'PlayStation 4'  THEN PRICE ELSE null  end) 'Gaming - PlayStation 4',
    SUM(CASE WHEN [CATEGORY 1] = 'Antiques' and [CATEGORY 2] = 'collectables'  THEN PRICE ELSE NULL end) 'Antiques - collectables'     
FROM YOURTABLE
GROUP BY DATE
ORDER BY DATE

【讨论】:

  • 我可以计算同一天的价格总和吗?
  • 这是我的查询结果,按日期和类别总和
猜你喜欢
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2013-05-02
  • 2013-10-04
相关资源
最近更新 更多