限制列数的交叉表

2024-01-18 01:48
文章标签 限制 交叉 列数

本文主要是介绍限制列数的交叉表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




这篇关于限制列数的交叉表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617784

相关文章

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为