高分求一句有难度的SQL语句

xuyi1979 2014-05-14 11:27:25
表结构和数据如下:
表: T
字段: SN QTY
数据: A 5
B 3
C 2

想通过一句SQL查询语句达到以下结果数据

A-1
A-2
A-3
A-4
A-5
B-1
B-2
B-3
C-1
C-2

请教各位高手!!
...全文
146 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-05-14
  • 打赏
  • 举报
回复
引用 10 楼 t101lian 的回复:
[quote=引用 3 楼 DBA_Huangzj 的回复:] [quote=引用 1 楼 t101lian 的回复:]
select a.SN +'-'+str(b.QTY ) from (select  SN from  T ) a  inner join (select QTY  from T) b on 1=1
你的结果是这样的: ------------- A- 5 B- 5 C- 5 A- 3 B- 3 C- 3 A- 2 B- 2 C- 2[/quote] 再弱弱的问下版主, 为什么这结果中会有这么多个空格?[/quote]str这个函数导致的
t101lian 2014-05-14
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
[quote=引用 1 楼 t101lian 的回复:]
select a.SN +'-'+str(b.QTY ) from (select  SN from  T ) a  inner join (select QTY  from T) b on 1=1
你的结果是这样的: ------------- A- 5 B- 5 C- 5 A- 3 B- 3 C- 3 A- 2 B- 2 C- 2[/quote] 再弱弱的问下版主, 为什么这结果中会有这么多个空格?
  • 打赏
  • 举报
回复
引用 4 楼 yoan2014 的回复:
IF EXISTS(SELECT NAME FROM sysobjects AS s WHERE NAME = 'test')
DROP TABLE test
GO

CREATE TABLE test (sn CHAR(1) , qty INT)
GO
INSERT INTO test
SELECT 'A' , 5 UNION ALL
SELECT 'B' , 3 UNION ALL
SELECT 'C' , 2

GO
--執行查詢
SELECT test.sn , a.number + 1 FROM MASTER..spt_values AS a , test WHERE [TYPE] = 'P' AND a.number < test.qty

--結果
/*
sn
---- -----------
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
C 1
C 2

(10 row(s) affected)

*/


居然前三楼的都没想到用这种方法,特别是发奋,不应该啊
t101lian 2014-05-14
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
[quote=引用 1 楼 t101lian 的回复:]
select a.SN +'-'+str(b.QTY ) from (select  SN from  T ) a  inner join (select QTY  from T) b on 1=1
你的结果是这样的: ------------- A- 5 B- 5 C- 5 A- 3 B- 3 C- 3 A- 2 B- 2 C- 2[/quote] 噢 , 看错了,
连星入剑端 2014-05-14
  • 打赏
  • 举报
回复
呃,看起来思路和楼上是一样的,这是在比手速么,
连星入剑端 2014-05-14
  • 打赏
  • 举报
回复

CREATE TABLE #testTable
    (
      Sn VARCHAR(10) NOT NULL ,
      Qty INT NOT NULL
    );
GO

INSERT  INTO #testTable
VALUES  ( 'A', 5 ),
        ( 'B', 3 ),
        ( 'C', 2 );
GO

SELECT  *
FROM    #testTable;
GO

-- 使用辅助的序列表来完成,这里用master..spt_values来替代;
SELECT  tt.Sn + '-' + CAST(sv.number AS VARCHAR)
FROM    #testTable AS tt
        CROSS JOIN master..spt_values AS sv
WHERE   sv.number BETWEEN 1 AND tt.Qty
        AND sv.type = 'P'
GO

yoan2014 2014-05-14
  • 打赏
  • 举报
回复
要連起來的話自己再加一下
yoan2014 2014-05-14
  • 打赏
  • 举报
回复
IF EXISTS(SELECT NAME FROM sysobjects AS s WHERE NAME = 'test')
	DROP TABLE test
GO

CREATE TABLE test (sn CHAR(1) , qty INT)
GO
INSERT INTO test  
SELECT 'A' , 5 UNION ALL
SELECT 'B' , 3 UNION ALL
SELECT 'C' , 2 

GO
--執行查詢
SELECT test.sn , a.number + 1 FROM MASTER..spt_values AS a , test  WHERE [TYPE] = 'P' AND  a.number < test.qty 

--結果
/*
 sn   
---- -----------
A    1
A    2
A    3
A    4
A    5
B    1
B    2
B    3
C    1
C    2

(10 row(s) affected)

 */
發糞塗牆 2014-05-14
  • 打赏
  • 举报
回复
引用 1 楼 t101lian 的回复:
select a.SN +'-'+str(b.QTY ) from (select  SN from  T ) a  inner join (select QTY  from T) b on 1=1
你的结果是这样的: ------------- A- 5 B- 5 C- 5 A- 3 B- 3 C- 3 A- 2 B- 2 C- 2
發糞塗牆 2014-05-14
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :DBA_HuangZJ(发粪涂墙)
-- Date    :2014-05-14 11:29:33
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
--	Apr  2 2010 15:48:46 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据[T]
if object_id('[T]') is not null drop table [T]
go 
create table [T]([SN] nvarchar(2),[QTY] int)
insert [T]
select 'A',5 union all
select 'B',3 union all
select 'C',2
--------------生成数据--------------------------
;WITH cte AS (
select *,SUBSTRING(REPLICATE(sn+',',qty) ,1,LEN(REPLICATE(sn+',',qty))-1)new
from [T] )
select     
    SUBSTRING(new,number,CHARINDEX(',',new+',',number)-number)+'-'+CAST(ROW_NUMBER()OVER(PARTITION BY new ORDER BY CURRENT_TIMESTAMP) AS VARCHAR(2)) AS New_Col
from
    cte a,master..spt_values 
where
    number >=1 and number<=len(new)  
    and type='p' 
    and substring(','+new,number,1)=','
----------------结果----------------------------
/* 
New_Col
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
A-1
A-2
A-3
A-4
A-5
B-1
B-2
B-3
C-1
C-2
*/
t101lian 2014-05-14
  • 打赏
  • 举报
回复
select a.SN +'-'+str(b.QTY ) from (select  SN from  T ) a  inner join (select QTY  from T) b on 1=1
renliquan 2014-05-14
  • 打赏
  • 举报
回复
引用 11 楼 DBA_Huangzj 的回复:
[quote=引用 10 楼 t101lian 的回复:] [quote=引用 3 楼 DBA_Huangzj 的回复:] [quote=引用 1 楼 t101lian 的回复:]
再弱弱的问下版主, 为什么这结果中会有这么多个空格?[/quote]str这个函数导致的[/quote] 运行了你的代码后有报个错 消息 8115,级别 16,状态 2,第 1 行 将 expression 转换为数据类型 varchar 时出现算术溢出错误。
renliquan 2014-05-14
  • 打赏
  • 举报
回复
引用 9 楼 TravyLee 的回复:
[quote=引用 4 楼 yoan2014 的回复:]
居然前三楼的都没想到用这种方法,特别是发奋,不应该啊[/quote] 用MASTER..spt_values只能对比到2047呀,我还是觉得DBA_Huangzj的比较可考。

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧