我已经阅读了MS数据透视表上的内容,但我仍然遇到问题.
我有一个正在创建的临时表,我们会说第1列是商店号,第2列是周数,最后第3列是某种类型的总和.周数也是动态的,商店数是静态的.
Store Week xCount
------- ---- ------
102 1 96
101 1 138
105 1 37
109 1 59
101 2 282
102 2 212
105 2 78
109 2 97
105 3 60
102 3 123
101 3 220
109 3 87
Run Code Online (Sandbox Code Playgroud)
我希望它作为一个数据透视表出来,像这样:
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
Run Code Online (Sandbox Code Playgroud)
将数字存储在侧面,将数字存储在顶部.
我正在使用SQL Server 2005.
我的查询是:
SELECT (
SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
Run Code Online (Sandbox Code Playgroud)
而错误:
除非还指定了TOP或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效.
如何ORDER BY在子查询中使用?
我有一张顾客表
Customer ID Name
1 John
2 Lewis
3 Mary
Run Code Online (Sandbox Code Playgroud)
我有另一张表CustomerRewards
TypeID Description
1 Bronze
2 Silver
3 Gold
4 Platinum
5 AnotherOne
Run Code Online (Sandbox Code Playgroud)
决赛桌
RewardID TypeID CustomerID
1 1 1
2 1 1
3 2 1
4 2 2
Run Code Online (Sandbox Code Playgroud)
customerTypes表是动态的,可以添加和删除许多这些类型.基本上我想要的是动态生成的列和每个列中的计数,类似于
CustomerName Bronze Silver Gold Platinum AnotherOne total
John 2 1 0 0 0 3
Lewis 0 1 0 0 0 1
Grand TOTAL 2 2 0 0 0 4
Run Code Online (Sandbox Code Playgroud)
问题就像我说的那样,类型是动态的,客户是动态的,所以我需要根据系统中的类型使列成为动态的
我已经在DataGridView中标记了c#,因为我需要它
提前致谢
很抱歉这个问题很长,但是这里包含了我用来测试场景的所有SQL,希望能够清楚地说明我在做什么.
我在SQL Server 2005中构建了一些动态SQL来生成PIVOT表.
下面是执行此操作的代码.使用各种选择显示原始数据使用GROUP BY的值和PIVOT中的值,我想要它们.
BEGIN TRAN
--Create the table
CREATE TABLE #PivotTest
(
ColumnA nvarchar(500),
ColumnB nvarchar(500),
ColumnC int
)
--Populate the data
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'X', 1)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'Y', 2)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'Z', 3)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'X', 4)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'Y', 5)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('B', 'Z', 6)
INSERT …Run Code Online (Sandbox Code Playgroud) sql-server pivot sql-injection sql-server-2005 dynamic-pivot
我有一张很长的桌子(例如)
Date Person Number
2015-01-03 A 4
2015-01-04 A 2
2015-01-05 A 3
2015-01-03 B 5
2015-01-04 B 6
2015-01-05 B 7
2015-01-03 C 1
2015-01-04 C 3
2015-01-05 C 4
2015-01-05 D 4
2015-01-04 E 1
2015-01-05 E 3
Run Code Online (Sandbox Code Playgroud)
我需要它看起来像(宽):
Date A B C D E
2015-01-03 4 5 1 0 0
2015-01-04 2 6 3 0 1
2015-01-05 3 7 4 4 3
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激。我正在使用交易。谢谢。
我有两张桌子要结合.第一个表是客户端,另一个是产品.目前我有22个产品,但我希望有一个灵活的数据库设计,所以在产品数据库中没有22列,每个客户每个产品有1行,所以如果我添加或删除1个产品,我不会必须改变数据库结构.
我想要一个select语句,我为每个客户选择所有产品,输出应该在一行中,每个产品都有一列.
我已经看到了一些类似的其他问题,但目标是将所有行连接在一列中 - 这是我不想要的.
假设有2个客户和3个产品.
表客户端:
ClientId | ClientName
---------------------
1 | Name1
2 | Name2
Run Code Online (Sandbox Code Playgroud)
表产品
ProductId | ClientId | Product
-------------------------------------
1 | 1 | SomeproductA
2 | 1 | SomeproductB
3 | 1 | SomeproductA
4 | 2 | SomeproductC
5 | 2 | SomeproductD
6 | 2 | SomeproductA
Run Code Online (Sandbox Code Playgroud)
输出应该是这样的:
表输出:
ClientId | ClientName | Product1 | Product 2 | Product 3
-------------------------------------------------------------------
1 | Name1 | SomeproductA | SomeproductB | SomeproductA
2 | Name2 …Run Code Online (Sandbox Code Playgroud) 我需要在报告中显示格式化数据.我使用三个表,其中一个添加新用户,第二个用于付款,最后一个用于任何用户辞职.以下是示例表和默认数据:
CREATE TABLE [dbo].[Entry]
(
[EmpId] [int] IDENTITY(1,1) NOT NULL,
[EmpName] [nvarchar](40) NULL,
[Address] [nvarchar](100) NULL,
[Email] [nvarchar](20) NULL,
[EntryDate] [datetime] NULL
)
INSERT [dbo].[Entry] ([EmpId], [EmpName], [Address], [Email], [EntryDate])
VALUES (1, N'John', N'On Earth', N'john@abc.com', CAST(0x0000A58000000000 AS DateTime)),
(2, N'Jack', N'On Earth', N'jack@abc.com', CAST(0x0000A5A800000000 AS DateTime)),
(3, N'Jessi', N'On Earth', N'jessi@abc.com', CAST(0x0000A5CF00000000 AS DateTime)),
(4, N'Jackson', N'On Earth', N'jackson@abc.com', CAST(0x0000A5E400000000 AS DateTime))
CREATE TABLE [dbo].[Payment]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[EmpId] [int] NULL,
[Payment] [float] NULL,
[PayDate] [datetime] …Run Code Online (Sandbox Code Playgroud) 由于我的应用程序的需要,我必须将查询的列名称作为第一行返回。现在我必须对这个结果进行 PIVOT,以便将其与我的结果集进行 UNION,但困难的部分是:它必须是动态的,因此如果我向该表添加新列,SELECT 会将所有名称进行透视。
以下 SELECT 为我带来了列名称:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Codes'
ORDER BY INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION
Run Code Online (Sandbox Code Playgroud)
我的结果集是:
COLUMN_NAME
Id
CodeName
Country
StartDate
EndDate
Run Code Online (Sandbox Code Playgroud)
我期望的是:
Id CodeName Country StartDate EndDate (... whatever other columns I might have)
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法可以做到这一点,而无需对列名称进行硬编码?
先感谢您!
如果我想知道每个用户在某一天在内联网上花了多少时间,我可以使用自定义功能 - 2个示例:
select * from [dbo].[usertime]('2016-04-08')
userid totaltime
-----------------
1 4430
2 11043
5 13045
select * from [dbo].[usertime]('2016-04-09')
userid totaltime
-----------------
1 345
3 12066
9 15344
Run Code Online (Sandbox Code Playgroud)
我无法控制该功能,只能使用其输出.在totaltime以秒为单位.
从另一张表中,我可以选择一年中的日期:
select * from dates;
date
----------
2016-01-01
...
2016-04-08
2016-04-09
Run Code Online (Sandbox Code Playgroud)
我想运行自定义函数usertime为每个date在dates表和结果存储在一个临时表,如下所示:
userid 2016-01-01 .. 2016-04-08 2016-04-09
----------------------------------------------
1 .. 4430 345
2 .. 11043 0
3 .. 0 12066
5 .. 13045 0
9 .. 0 15344
Run Code Online (Sandbox Code Playgroud)
这需要我调用usertime一个循环,伪:
create …Run Code Online (Sandbox Code Playgroud) 我需要选择 XRef 表中 B 列的唯一值组合的计数,该表按 A 列分组。
考虑以下架构和数据,它表示一个简单的家庭结构。每个孩子都有父亲和母亲:
表父亲
| 父亲ID | 姓名 |
|---|---|
| 1 | 亚历克斯 |
| 2 | 鲍勃 |
表妈妈
| 母亲ID | 姓名 |
|---|---|
| 1 | 爱丽丝 |
| 2 | 芭芭拉 |
表儿童
| 儿童ID | 父亲ID | 母亲ID | 姓名 |
|---|---|---|---|
| 1 | 1(亚历克斯) | 1(爱丽丝) | 亚当 |
| 2 | 1(亚历克斯) | 1(爱丽丝) | 比利 |
| 3 | 1(亚历克斯) | 2(芭芭拉) | 席琳 |
| 4 | 2(鲍勃) | 2(芭芭拉) | 德里克 |
每个父亲的母亲的不同组合是:
总的来说,母亲有两种不同的组合:
我想编写的查询将返回母亲的这些不同组合的计数,无论它们与哪个父亲相关联:
| 独特的母亲团体 |
|---|
| 2 |
我能够使用 STRING_AGG 函数成功完成此操作,但感觉很笨拙。它还需要操作数百万行,并且目前速度相当慢。有没有更惯用的方法来代替集合操作来做到这一点?
这是我的工作示例:
-- Drop pre-existing tables
DROP TABLE IF EXISTS dbo.Child;
DROP TABLE IF EXISTS dbo.Father;
DROP TABLE IF EXISTS dbo.Mother;
-- …Run Code Online (Sandbox Code Playgroud)