如何从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
答案 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