我该如何生成sql矩阵

时间:2017-11-21 08:31:45

标签: sql sql-server matrix

如何从sql查询中的表创建此矩阵?我有桌子,显示有多少商品被售出。我想要显示商品的标题而不是商品的ID。但重要的是,toy1,toy2和toy3字段的数据类型为十进制(20,8)

Table 1

id   year   toy1   toy2   toy3
-------------------------------
-1           1      3      2
 1   2016    100    20     50
 2   2017    150    120    40

Table 2

id     toy
---------------
1      doll
2      car
3      bear

Result matrix

 id   year   toy1   toy2   toy3
-------------------------------
-1           doll   bear   car
 1   2016    100    20     50
 2   2017    150    120    40

4 个答案:

答案 0 :(得分:1)

对于SQL Server,我会做一些left joins

SELECT T.id,
       T.year,
       CASE
           WHEN T1.TOY IS NULL THEN CAST(T.[toy1] AS VARCHAR) ELSE T1.TOY
       END [toy1],
      CASE
           WHEN T2.TOY IS NULL THEN CAST(T.[toy2] AS VARCHAR) ELSE T2.TOY
       END [toy2],
      CASE
           WHEN T3.TOY IS NULL THEN CAST(T.[toy3] AS VARCHAR) ELSE T3.TOY
       END [toy3]

FROM <Table1> T
     LEFT JOIN <Table2> T1 ON T1.ID = T.toy1
     LEFT JOIN <Table2> T2 ON T2.ID = T.toy2
     LEFT JOIN <Table2> T3 ON T3.ID = T.toy3; 

结果:

id  year    toy1    toy2    toy3
-1  NULL    doll    bear    car
1   2016    100     20      50
2   2017    150     120     40

答案 1 :(得分:1)

这是一个非常糟糕的数据模型。

表格应代表实体,例如玩具,订单,年销售额......另一方面的列表示该实体的属性,例如:玩具的名称或价格,订单的日期,销售的年份。在你的模型中你混合它。什么是&#34; toy1&#34;?玩具ID?金额?似乎两者兼而有之。然后你的桌子2允许许多很多玩具,而你的桌子1只允许3个。这不匹配。

你应该拥有什么:

桌面玩具

toy_id | name
-------+-----
1      | doll
2      | car
3      | bear

表格销售

year | toy_id | amount
2016 | 1      |  100
2016 | 2      |   20
2016 | 3      |   50
2017 | 1      |  150
2017 | 2      |  120
2017 | 3      |   40

你也不会写一个查询给你矩阵。您可以选择数据(例如select * from sales order by year, toy_id)并让您的应用处理显示。使用任何编程语言(无论是C#,Visual Basic,Java,PHP等)都可以很容易地在循环中获取数据,并将其显示在网格中。

在SQL查询中,您必须事先知道列,但矩阵输出不是这种情况,因为在运行甚至编写查询之前,您必须知道玩具表中有多少玩具。每次添加玩具时,您都必须更改查询。这不是关系数据库的工作方式。

答案 2 :(得分:0)

我不确定但是这样的事情:

SELECT *, COUNT(*) OVER (PARTITION BY Reader,  ReadTime) [Count] FROM <table>

答案 3 :(得分:0)

一种方法是只选择-1行并应用算法来获取玩具名称。那可以是UNION ALL,表的其余部分不是-1行。

您必须将输出转换为varchar以混合单词和数字:

DECLARE @table1 TABLE (id int, [year] int, toy1 int, toy2 int, toy3 int)
DECLARE @table2 TABLE (id int, toy varchar(100))

INSERT INTO @table1 VALUES (-1, null, 1, 3, 2), (1, 2016, 100,20,50), (2,2017,150,120,40)
INSERT INTO @table2 VALUES (1,'doll'), (2,'car'), (3,'bear')

-- for the -1 row
SELECT T1.id, COALESCE(CAST(year as varchar), '') AS year
      ,(SELECT toy FROM @table2 T2 WHERE T2.id = T1.toy1) AS toy1
      ,(SELECT toy FROM @table2 T2 WHERE T2.id = T1.toy2) AS toy2
      ,(SELECT toy FROM @table2 T2 WHERE T2.id = T1.toy3) AS toy3

  FROM @table1 T1
 WHERE T1.id = -1

UNION ALL

--all other rows
SELECT T3.id
      ,CAST(T3.year as varchar) 
      ,CAST(T3.toy1 as varchar)
      ,CAST(T3.toy2 as varchar)
      ,CAST(T3.toy3 as varchar)

  FROM @table1 T3
 WHERE T3.id <> -1

提供输出:

id  year    toy1    toy2    toy3
-1          doll    bear    car
1   2016    100     20      50
2   2017    150     120     40